home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 1) (1997).iso / intros / 64k / revolt / sources / player / usmod.asm < prev    next >
Assembly Source File  |  1996-03-01  |  63KB  |  2,936 lines

  1. zpliku=1
  2. ;
  3. ;       ╔═════════════════════════════╗
  4. ;       ║                             ║
  5. TITLE   ║ GRAVIS ULTRASOUND MODPLAYER ║
  6. ;       ║                             ║
  7. ;       ╚═════════════════════════════╝
  8. ;
  9. ; THIS MODULE PLAYER WAS CODED IN EARLY 1994
  10. ;
  11. ;                        BY SILVIO TURELLO (FRONTMAN/CREW242)
  12. ;
  13. ; IT IS A COMPLETELY REVISED VERSION OF GUSPLAY 1.5
  14. ;
  15. ;                        BY ROBERT ADOLFSSON (CASCADA)
  16. ;
  17. ; FEATURES: 4/6/8-CHANNEL-MODS (M.K./FLT4/FLT8/OCTA/8CHN/6CHN)
  18. ;
  19. ;           16-FX-CHANNELS, FULL MOD-FX SUPPORT, FULL 8/16-BIT DMA SUPPORT
  20. ;
  21. ;           1 MB GUS SUPPORT, PANNING COMMAND E8x, OF COURSE VERY FAST
  22. ;
  23. ; MEMORY:   13K CODE, 0-64K TRACKBUF
  24. ;
  25. .ALPHA
  26. .MODEL MEDIUM
  27. COM_OR_OBJ    = 4
  28. STACKLENGTH     = 0100H
  29. UGROUP4 GROUP CODE_SEG4, DATA_SEG4
  30. ASSUME CS:UGROUP4, DS:UGROUP4, SS:UGROUP4
  31. ;=============================================================================
  32. IRQ1            = 20H
  33. IRQ2        = 21H
  34. IRQ3        =0A0H
  35. IRQ4        =0A1H
  36. TIMER0        = 40H
  37. PIT1        = 43H
  38. UHR_INDEX    = 70H
  39. UHR_PORT    = 71H
  40. UHR_STATA    = 0AH
  41. UHR_STATB    = 0BH
  42. UHR_STATC    = 0CH
  43. ;-----------------------------------------------------------------------------
  44. NumVoices    = 25        ; Number of voices to use
  45. StatusPort    = 6h        ; UltraSound Ports
  46. TimerCtrlPort    = 8h
  47. TimerDataPort    = 9h
  48. DMASetPort    = 0Bh
  49. MidiCtrlPort    = 100h
  50. MidiDataPort    = 101h
  51. ActiveVoicePort    = 102h
  52. CommandPort    = 103h
  53. DataLowPort    = 104h
  54. DataHighPort    = 105h
  55. DRAMIOPort    = 107h
  56. GUS_VERSION    = 506h
  57. ICMIX_SEL    = 506h
  58. ICMIX_DATA    = 106h
  59. CODEC_BASE    = 10Ch
  60.  
  61. WriteVoiceMode    = 00h        ; UltraSound Commands
  62. SetVoiceFreq    = 01h        ; Value=Freq/Divisor
  63. LoopStartLo    = 02h
  64. LoopStartHi    = 03h
  65. SampleEndLo    = 04h
  66. SampleEndHi    = 05h
  67. VolRampRate    = 06h
  68. VolRampStart    = 07h
  69. VolRampEnd    = 08h
  70. SetVolume    = 09h
  71. SampleStartLo    = 0Ah
  72. SampleStartHi    = 0Bh
  73. VoiceBalance    = 0Ch
  74. VolumeCtrl    = 0Dh
  75. VoicesActive    = 0Eh
  76. DMACtrl        = 41h
  77. DMAAddr        = 42h
  78. DRAMAddrLo    = 43h
  79. DRAMAddrHi    = 44h
  80. Initialize    = 4Ch
  81. ReadVolume    = 89h
  82. VoicePosLo    = 8Ah
  83. VoicePosHi    = 8Bh
  84. ReadVolCtrl    = 8Dh
  85.  
  86. Voices14    = 4300        ; Divisors
  87. Voices15    = 4000
  88. Voices16    = 3700
  89. Voices17    = 3500
  90. Voices18    = 3300
  91. Voices19    = 3100
  92. Voices20    = 3030
  93. Voices21    = 2800
  94. Voices22    = 2700
  95. Voices23    = 2600
  96. Voices24    = 2500
  97. Voices25    = 2400
  98. Voices26    = 2300
  99. Voices27    = 2200
  100. Voices28    = 2100
  101. Voices29    = 2000
  102. Voices30    = 2000
  103. Voices31    = 1900
  104. Voices32    = 1800
  105. ;-----------------------------------------------------------------------------
  106. CHAN_SIZE    = 52
  107. CHAN_INFO STRUC
  108. SAMP_OFF    DD 0
  109. FREQ_VAL     DW 0
  110. VOL         DW 0
  111. OLD_VOL        DW 0
  112. FINE         DW 0
  113. REPEAT         DW 0
  114. REPLEN         DW 0
  115. LEN         DW 0
  116. AMIGA         DW 0
  117. EFFECT         DW 0
  118. VIBRATO_POINT     DW 0
  119. OLD_VIBRATO     DW 0
  120. PORT_TO        DW 0
  121. OLD_PORT_TO     DW 0
  122. EFFECT_TIME    DW 0
  123. CURR_SAMP    DW 0
  124. OLD_SAMP    DW 0
  125. ARP         DW 0,0,0
  126. ARP_COUNTER     DW 0
  127. INST_SET    DB 0
  128. BALANCE        DB 0
  129. LOOP_ONOFF    DW 0
  130. OFFSET_ADD    DW 0
  131. TRACK_OFF    DW 0
  132. CHAN_INFO ENDS
  133. ;=============================================================================
  134.  
  135. DATA_SEG4 SEGMENT WORD USE16
  136. ;=============================================================================
  137. PROG_START_SEG  DW 0
  138. PROG_END_SEG    DW 0
  139. IF COM_OR_OBJ
  140. VAR_BUFSEG    DW 0
  141. ELSE
  142. VAR_BUFSEG    DW 8000H
  143. ENDIF
  144. GDDLENGTH    DD 0
  145. GDDREST        DW 0
  146. GDDHANDLE    DW 0
  147. GDDSEG        DW 0
  148. BUFSEG        DW 0
  149. GDDZEIG        DB 0
  150. SAM_CH        DB 8
  151. MOD_STAT    DB 0
  152. US_MODUS    DB 0            ;0=MUSIC&FX, 1=MUSIC, 2=FX, 3=OFF
  153. CD_MIXER    DB 0            ;0=MODULES ONLY, 1=CD MIXED
  154. LOADMOD_FLAG    DB 0
  155. SYSTEM        DB 0
  156. IRQCOUNT    DB 56
  157. COMP_SPEED2     DW 0106H
  158. COMP_SPEED3     DW 4006H
  159. COMP_SPEED4     DW 0
  160. COMP_SPEED5     DW 1165
  161. HOLD70  LABEL   DWORD
  162.         DW OFFSET CONTROL_CHANNELS, 0
  163. PAN_REGS    DB 3,12,12,3,3,12,12,3
  164.         DB 2,13,2,13,2,13,2,13
  165.         DB 2,13,2,13,2,13,2,13
  166.         DB 2,13,2,13,2,13,2,13
  167. PAN_FX        DB 0
  168. SONG_START    DB 0
  169. comment    #
  170. MOD_NAME    DB 88 DUP(0)
  171. ;-----------------------------------------------------------------------------
  172. ERROR1_TEXT    DB "MOD ERROR",13,10,"$"
  173. ERROR2_TEXT    DB "FX ERROR",13,10,"$"
  174. OUT_TEXT    DB "+/- VOLUME",13,10
  175.         DB "1   PLAY SAMPLE",13,10
  176.         DB "9   INIT REPEAT",13,10
  177.         DB "0   MUSIC MODE",13,10,"$"
  178. SAMPLE_NAME    DB "SAMPLE1.SAM",0
  179. CONFIG_NAME     DB "SS3.CFG",0
  180. CFG_TEXT2       DB "DEFAULT MUSIC MODE = ",0
  181. CFG_TEXT3       DB "SOUNDCARD BASE PORT = ",0
  182. CFG_TEXT5       DB "SOUNDCARD DMA NUMBER = ",0
  183. CFG_TEXT7       DB "SYSTEM COMPATIBILITY = ",0
  184. #
  185. DMA_ADR        DB 0,2,4,6,0C0H,0C4H,0C8H,0CCH
  186. DMA_CNT        DB 1,3,5,7,0C2H,0C6H,0CAH,0CEH
  187. DMA_PAGE    DB 87H,83H,81H,82H,8FH,8BH,89H,8AH
  188. DMA_STAT    DB 08H,08H,08H,08H,0D0H,0D0H,0D0H,0D0H
  189. DMA_BITS    DB 1,2,4,8,1,2,4,8
  190. DMA_MASK    DB 0AH,0AH,0AH,0AH,0D4H,0D4H,0D4H,0D4H
  191. DMA_MOD        DB 0BH,0BH,0BH,0BH,0D6H,0D6H,0D6H,0D6H
  192. DMA_FLIP    DB 0CH,0CH,0CH,0CH,0D8H,0D8H,0D8H,0D8H
  193. DMA_RESET    DB 0DH,0DH,0DH,0DH,0DAH,0DAH,0DAH,0DAH
  194. DMA_SET_DATA    DB 0,1,0,2,0,3,4,5
  195. ;-----------------------------------------------------------------------------
  196. ; PROTRACKER VARIABLEN
  197. ;-----------------------------------------------------------------------------
  198. ALIGN 2
  199. ULTRA16        DW 0
  200. CODEC_PORT    DW 32CH
  201. BASE_PORT    DW 220H
  202. DMA_CHANNEL    DW 1            ;DMA 0 IS NO DMA BYTE-PUSHING
  203. MASTER_VOLUME    DW 255
  204. MUSIC_VOLUME    DW 255
  205. FX_VOLUME    DW 255
  206. MUSIC_VOL    DW 255
  207. FX_VOL        DW 255
  208. BPM_RATE    DW 1024
  209. BPM_VALUE    DW 125
  210. BPM_COUNT    DD 0
  211. BPM_SPEED    DD 0
  212. COUNTER        DW 0
  213. CH_NUMB        DW 4
  214. PATT_SPEED    DW 0
  215. PATT_COUNT    DW 0
  216. PATT_ROW    DW 0
  217. PATT_CURRENT    DW 0
  218. PATT_BREAK    DW 0
  219. ;-----------------------------------------------------------------------------
  220. ; MTM - TRACKSTRUKTUR
  221. ;-----------------------------------------------------------------------------
  222. ALIGN 2
  223. TRACK_NUMBER    DW 0
  224. TRACK_INFO    DB 8 DUP(0)
  225. TRACK_SEG    DW 0
  226. TRACKS_OFFSET    DW OFFSET TRACK1_DATA, OFFSET TRACK2_DATA, OFFSET TRACK3_DATA
  227.         DW OFFSET TRACK4_DATA, OFFSET TRACK5_DATA, OFFSET TRACK6_DATA
  228.         DW OFFSET TRACK7_DATA, OFFSET TRACK8_DATA
  229. TRACK1_DATA    DB 128 DUP(0)
  230. TRACK2_DATA    DB 128 DUP(0)
  231. TRACK3_DATA    DB 128 DUP(0)
  232. TRACK4_DATA    DB 128 DUP(0)
  233. TRACK5_DATA    DB 128 DUP(0)
  234. TRACK6_DATA    DB 128 DUP(0)
  235. TRACK7_DATA    DB 128 DUP(0)
  236. TRACK8_DATA    DB 128 DUP(0)
  237. ;-----------------------------------------------------------------------------
  238. ; MOD - DATEISTRUKTUR
  239. ;-----------------------------------------------------------------------------
  240. ALIGN 2
  241. PATTERN_SIZE    DW 0
  242. PATTERN_SEG    DW 0
  243. PATTERN_NUMBER    DW 0
  244. IOFFSET        DD 31 DUP(0)
  245. ISIZE        DW 31 DUP(0)
  246. IVOLUME        DW 31 DUP(0)
  247. IFINETUNE    DW 31 DUP(0)
  248. ILOOP_START    DW 31 DUP(0)
  249. ILOOP_SIZE    DW 31 DUP(0)
  250. SONG_SIZE    DB 0
  251. SONG_LOOP    DB 0
  252. ;-----------------------------------------------------------------------------
  253. ; PLAYER - KONTROLLSTRUKTUREN
  254. ;-----------------------------------------------------------------------------
  255. ALIGN 2
  256. SONG_DATA    LABEL    BYTE
  257. FREQ_TABLE    DW 780 DUP(0)    ;908
  258. QUEUE_BUFFER    DW 128 DUP(0)
  259. SAMP_CHANS    CHAN_INFO 8 DUP(<>)
  260. SAMPLE_CHAN    CHAN_INFO <>
  261. ;-----------------------------------------------------------------------------
  262. ; SINGLE SAMPLE VARIABLES
  263. ;-----------------------------------------------------------------------------
  264. GUS_MEM        DD 0
  265. SAMPLE_ZEIG    DW 0
  266. SAMPLE_MEM    DD 64 DUP(0)
  267. SAMPLE_BIG    DW 64 DUP(0)
  268. SAM_COUNT    DW 32 DUP(0)
  269. ;-----------------------------------------------------------------------------
  270. ALIGN 2
  271. PattJumps    DW OFFSET ARPeggioFix    ; 0
  272.         DW OFFSET NoPattEFFECT    ; 1
  273.         DW OFFSET NoPattEFFECT    ; 2
  274.         DW OFFSET PORT_TOFix    ; 3
  275.         DW OFFSET VibratoFix    ; 4
  276.         DW OFFSET NoPattEFFECT    ; 5
  277.         DW OFFSET NoPattEFFECT    ; 6
  278.         DW OFFSET NoPattEFFECT    ; 7
  279.         DW OFFSET NoPattEFFECT    ; 8
  280.         DW OFFSET SampleOff    ; 9
  281.         DW OFFSET NoPattEFFECT    ; A
  282.         DW OFFSET PosJump    ; B
  283.         DW OFFSET VOLume    ; C
  284.         DW OFFSET BreakPatt    ; D
  285.         DW OFFSET NoPattEFFECT    ; E
  286.         DW OFFSET SpeedSet    ; F
  287.  
  288. EPattJumps    DW OFFSET NoPattEFFECT    ; 0
  289.         DW OFFSET FINEPortUp    ; 1
  290.         DW OFFSET FINEPortDown    ; 2
  291.         DW OFFSET NoPattEFFECT    ; 3
  292.         DW OFFSET NoPattEFFECT    ; 4
  293.         DW OFFSET NoPattEFFECT    ; 5
  294.         DW OFFSET NoPattEFFECT    ; 6
  295.         DW OFFSET NoPattEFFECT    ; 7
  296.         DW OFFSET PANNING    ; 8
  297.         DW OFFSET NoPattEFFECT    ; 9
  298.         DW OFFSET FINEVOLUP    ; A
  299.         DW OFFSET FINEVOLDown    ; B
  300.         DW OFFSET NoPattEFFECT    ; C
  301.         DW OFFSET NoPattEFFECT    ; D
  302.         DW OFFSET NoPattEFFECT    ; E
  303.         DW OFFSET NoPattEFFECT    ; F
  304.  
  305. EFFECTJumps    DW OFFSET ARPeggio    ; 0
  306.         DW OFFSET PortUp    ; 1
  307.         DW OFFSET PortDown    ; 2
  308.         DW OFFSET PORT_TOTone    ; 3
  309.         DW OFFSET Vibrato    ; 4
  310.         DW OFFSET PORT_TOVSlide    ; 5
  311.         DW OFFSET VibratoVSlide    ; 6
  312.         DW OFFSET NoEFFECT    ; 7
  313.         DW OFFSET NoEFFECT    ; 8
  314.         DW OFFSET NoEFFECT    ; 9
  315.         DW OFFSET VOLSlide    ; A
  316.         DW OFFSET NoEFFECT    ; B
  317.         DW OFFSET NoEFFECT    ; C
  318.         DW OFFSET NoEFFECT    ; D
  319.         DW OFFSET NoEFFECT    ; E
  320.         DW OFFSET NoEFFECT    ; F
  321.  
  322. EEFFECTJumps    DW OFFSET NoEFFECT    ; 0
  323.         DW OFFSET NoEFFECT    ; 1
  324.         DW OFFSET NoEFFECT    ; 2
  325.         DW OFFSET NoEFFECT    ; 3
  326.         DW OFFSET NoEFFECT    ; 4
  327.         DW OFFSET NoEFFECT    ; 5
  328.         DW OFFSET NoEFFECT    ; 6
  329.         DW OFFSET NoEFFECT    ; 7
  330.         DW OFFSET NoEFFECT    ; 8
  331.         DW OFFSET RetrigNote    ; 9
  332.         DW OFFSET NoEFFECT    ; A
  333.         DW OFFSET NoEFFECT    ; B
  334.         DW OFFSET CutNote    ; C
  335.         DW OFFSET DelayNote    ; D
  336.         DW OFFSET NoEFFECT    ; E
  337.         DW OFFSET NoEFFECT    ; F
  338.  
  339. SIN_TAB        DB 0,25,50,74,98,120,142,162,180,197,212,225,236
  340.         DB 244,250,254,255,254,250,244,236,225,212,197,180
  341.         DB 162,142,120,98,74,50,25
  342.  
  343. PERIOD_TABLE    LABEL    WORD
  344. DW 856,808,762,720,678,640,604,570,538,508,480,453 ;C-1 to H-1 Finetune +0.
  345. DW 428,404,381,360,339,320,302,285,269,254,240,226 ;C-2 to H-2 Finetune +0.
  346. DW 214,202,190,180,170,160,151,143,135,127,120,113 ;C-3 to H-3 Finetune +0.
  347. DW 107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60, 56 ;C-4 to H-4 Finetune +0.
  348.  
  349. DW 850,802,757,715,674,637,601,567,535,505,477,450 ;C-1 to H-1 Finetune +1.
  350. DW 425,401,379,357,337,318,300,284,268,253,239,225 ;C-2 to H-2 Finetune +1.
  351. DW 213,201,189,179,169,159,150,142,134,126,119,113 ;C-3 to H-3 Finetune +1.
  352. DW 106,100, 94, 89, 84, 79, 75, 71, 67, 83, 59, 56 ;C-4 to H-4 Finetune +1.
  353.  
  354. DW 844,796,752,709,670,632,597,563,532,502,474,447 ;C-1 to H-1 Finetune +2.
  355. DW 422,398,376,355,335,316,298,282,266,251,237,224 ;C-2 to H-2 Finetune +2.
  356. DW 211,199,188,177,167,158,149,141,133,125,118,112 ;C-3 to H-3 Finetune +2.
  357. DW 105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59, 56 ;C-4 to H-4 Finetune +2.
  358.  
  359. DW 838,791,746,704,665,628,592,559,528,498,470,444 ;C-1 to H-1 Finetune +3.
  360. DW 419,395,373,352,332,314,296,280,264,249,235,222 ;C-2 to H-2 Finetune +3.
  361. DW 209,198,187,176,166,157,148,140,132,125,118,111 ;C-3 to H-3 Finetune +3.
  362. DW 104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59, 55 ;C-4 to H-4 Finetune +3.
  363.  
  364. DW 832,785,741,699,660,623,588,555,524,495,467,441 ;C-1 to H-1 Finetune +4.
  365. DW 416,392,370,350,330,312,294,278,262,247,233,220 ;C-2 to H-2 Finetune +4.
  366. DW 208,196,185,175,165,156,147,139,131,124,117,110 ;C-3 to H-3 Finetune +4.
  367. DW 104, 98, 92, 87, 82, 78, 73, 69, 65, 62, 58, 55 ;C-4 to H-4 Finetune +4.
  368.  
  369. DW 826,779,736,694,655,619,584,551,520,491,463,437 ;C-1 to H-1 Finetune +5.
  370. DW 413,390,368,347,328,309,292,276,260,245,232,219 ;C-2 to H-2 Finetune +5.
  371. DW 206,195,184,174,164,155,146,138,130,123,116,109 ;C-3 to H-3 Finetune +5.
  372. DW 103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58, 54 ;C-4 to H-4 Finetune +5.
  373.  
  374. DW 820,774,730,689,651,614,580,547,516,487,460,434 ;C-1 to H-1 Finetune +6.
  375. DW 410,387,365,345,325,307,290,274,258,244,230,217 ;C-2 to H-2 Finetune +6.
  376. DW 205,193,183,172,163,154,145,137,129,122,115,109 ;C-3 to H-3 Finetune +6.
  377. DW 102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57, 54 ;C-4 to H-4 Finetune +6.
  378.  
  379. DW 814,768,725,684,646,610,575,543,513,484,457,431 ;C-1 to H-1 Finetune +7.
  380. DW 407,384,363,342,323,305,288,272,256,242,228,216 ;C-2 to H-2 Finetune +7.
  381. DW 204,192,181,171,161,152,144,136,128,121,114,108 ;C-3 to H-3 Finetune +7.
  382. DW 102, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57, 54 ;C-4 to H-4 Finetune +7.
  383.  
  384. DW 907,856,808,762,720,678,640,604,570,538,504,480 ;C-1 to H-1 Finetune -8.
  385. DW 453,428,404,381,360,339,320,302,285,269,254,240 ;C-2 to H-2 Finetune -8.
  386. DW 226,214,202,190,180,170,160,151,143,135,127,120 ;C-3 to H-3 Finetune -8.
  387. DW 113,107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60 ;C-4 to H-4 Finetune -8.
  388.  
  389. DW 900,850,802,757,715,675,636,601,567,535,505,477 ;C-1 to H-1 Finetune -7.
  390. DW 450,425,401,379,357,337,318,300,284,268,253,238 ;C-2 to H-2 Finetune -7.
  391. DW 225,212,200,189,179,169,159,150,142,134,126,119 ;C-3 to H-3 Finetune -7.
  392. DW 112,106,100, 94, 89, 84, 79, 75, 71, 67, 63, 59 ;C-4 to H-4 Finetune -7.
  393.  
  394. DW 894,844,796,752,709,670,632,597,563,532,502,474 ;C-1 to H-1 Finetune -6.
  395. DW 447,422,398,376,355,335,316,298,282,266,251,237 ;C-2 to H-2 Finetune -6.
  396. DW 223,211,199,188,177,167,158,149,141,133,125,118 ;C-3 to H-3 Finetune -6.
  397. DW 111,105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -6.
  398.  
  399. DW 887,838,791,746,704,665,628,592,559,528,498,470 ;C-1 to H-1 Finetune -5.
  400. DW 444,419,395,373,352,332,314,296,280,264,249,235 ;C-2 to H-2 Finetune -5.
  401. DW 222,209,198,187,176,166,157,148,140,132,125,118 ;C-3 to H-3 Finetune -5.
  402. DW 111,104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -5.
  403.  
  404. DW 881,832,785,741,699,660,623,588,555,524,494,467 ;C-1 to H-1 Finetune -4.
  405. DW 441,416,392,370,350,330,312,294,278,262,247,233 ;C-2 to H-2 Finetune -4.
  406. DW 220,208,196,185,175,165,156,147,139,131,123,117 ;C-3 to H-3 Finetune -4.
  407. DW 110,104, 98, 92, 87, 82, 78, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -4.
  408.  
  409. DW 875,826,779,736,694,655,619,584,551,520,491,463 ;C-1 to H-1 Finetune -3.
  410. DW 437,413,390,368,347,338,309,292,276,260,245,232 ;C-2 to H-2 Finetune -3.
  411. DW 219,206,195,184,174,164,155,146,138,130,123,116 ;C-3 to H-3 Finetune -3.
  412. DW 109,103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -3.
  413.  
  414. DW 868,820,774,730,689,651,614,580,547,516,487,460 ;C-1 to H-1 Finetune -2.
  415. DW 434,410,387,365,345,325,307,290,274,258,244,230 ;C-2 to H-2 Finetune -2.
  416. DW 217,205,193,183,172,163,154,145,137,129,122,115 ;C-3 to H-3 Finetune -2.
  417. DW 108,102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57 ;C-4 to H-4 Finetune -2.
  418.  
  419. DW 862,814,768,725,684,646,610,575,543,513,484,457 ;C-1 to H-1 Finetune -1.
  420. DW 431,407,384,363,342,323,305,288,272,256,242,228 ;C-2 to H-2 Finetune -1.
  421. DW 216,203,192,181,171,161,152,144,136,128,121,114 ;C-3 to H-3 Finetune -1.
  422. DW 108,101, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57 ;C-4 to H-4 Finetune -1.
  423.  
  424. GUS_VOL        DW 01000H,08FF0H,09FF0H,0A800H,0AFF0H,0B400H,0B800H,0BC00H
  425.         DW 0BFF0H,0C200H,0C400H,0C600H,0C800H,0CA00H,0CC00H,0CE00H
  426.         DW 0CFF0H,0D100H,0D200H,0D300H,0D400H,0D500H,0D600H,0D700H
  427.         DW 0D800H,0D900H,0DA00H,0DB00H,0DC00H,0DD00H,0DE00H,0DF00H
  428.         DW 0DFF0H,0E080H,0E100H,0E180H,0E200H,0E280H,0E300H,0E380H
  429.         DW 0E400H,0E480H,0E500H,0E580H,0E600H,0E680H,0E700H,0E780H
  430.         DW 0E800H,0E880H,0E900H,0E980H,0EA00H,0EA80H,0EB00H,0EB80H
  431.         DW 0EC00H,0EC80H,0ED00H,0ED80H,0EE00H,0EE80H,0EF00H,0EF80H
  432.         DW 0F800H    ;SINGLE SAMPLE MAX VOL > SONG MAX VOL
  433. ;-----------------------------------------------------------------------------
  434. PROG_END        LABEL   BYTE    ;MUSS LETZE ZEILE IM DATENSEGMENT SEIN!
  435. ;-----------------------------------------------------------------------------
  436. DATA_SEG4 ENDS
  437.  
  438.  
  439.  
  440. .386
  441. CODE_SEG4 SEGMENT    PAGE USE16
  442. ;=============================================================================
  443.     ORG    100H
  444. PUBLIC _MAIN4_g
  445. PUBLIC configinit_g
  446. PUBLIC loadmod_g
  447. PUBLIC playmusic_g
  448. PUBLIC stopmusic_g
  449. PUBLIC endmusic_g
  450.  
  451. _MAIN4_G PROC FAR
  452.     JMP    MAIN_CONT        ;0100
  453.     RETF
  454. CONFIGINIT_G:        ;0104
  455.     CALL    CONFIG_INIT        ;0104
  456.     RETF
  457. LOADMOD_G:        ;0108
  458.     CALL    LOAD_MOD        ;0108
  459.     RETF
  460. PLAYMUSIC_G:        ;010C
  461.     CALL    PLAY_MUSIC        ;010C
  462.     RETF
  463. STOPMUSIC_G:        ;0110
  464.     CALL    STOP_MUSIC        ;0110
  465.     RETF
  466. ENDMUSIC_G:        ;0114
  467.     CALL    END_MUSIC        ;0114
  468.     RETF
  469. getSONGPOSITION_g:    ;24d
  470.     CALL    get_SONGPOSITION    ;24
  471.     RETF
  472. GETVOLUME_G:        ;0128
  473.     CALL    GET_VOLUME        ;0128
  474.     RETF
  475. SETVOLUME_G:        ;012C
  476.     CALL    SET_VOLUME        ;012C
  477.     RETF
  478. SETSONGLOOP_G:        ;0130
  479.     CALL    SET_SONGLOOP        ;0130
  480.     RETF
  481. SETSONGPOSITION_g:    ;0138
  482.     CALL    SET_SONGPOSITION    ;0138
  483.     RETF
  484. GETSONGMOD_G:        ;013C
  485.     CALL    GET_SONGMOD        ;013C
  486.     RETF
  487. SETSONGMOD_G:        ;0140
  488.     CALL    SET_SONGMOD        ;0140
  489.     RETF
  490. USOFF_G:            ;0144
  491.     CALL    US_OFF            ;0144
  492.     RETF
  493. INITDEVICE_G:        ;0148
  494.     CALL    INIT_DEVICE        ;0148
  495.     RETF
  496. _MAIN4_G ENDP
  497. ;=============================================================================
  498.  
  499.  
  500. ;=============================================================================
  501. ALIGN 2
  502. CONTROL_CHANNELS PROC NEAR
  503.  
  504.         push    ax es di
  505.         xor    ax,ax
  506.         mov    es,ax
  507.         mov    di,20
  508.         movzx    ax,byte ptr cs:[patt_row]
  509.         shl    ax,2
  510.         stosw
  511.         mov    al,byte ptr cs:[patt_current]
  512.         dec    al
  513. ;        mov    al,cs:[patt_row]
  514.         stosb
  515.         pop    di es ax
  516.  
  517.  
  518.     PUSH    EAX EBX ECX EDX ESI EDI EBP
  519.     PUSH    DS ES CS
  520.     POP    DS
  521.     CMP    SYSTEM,0
  522.     JNE    SHORT WT6
  523.     MOV    AL,UHR_STATC
  524.     OUT    UHR_INDEX,AL
  525.     JMP    SHORT WT1
  526. WT1:    JMP    SHORT WT2
  527. WT2:    IN    AL,UHR_PORT
  528. WT6:    MOV     AL,20H
  529.     OUT     IRQ3,AL
  530.     OUT    IRQ1,AL
  531.     STI
  532.     CMP    LOADMOD_FLAG,0
  533.     JNE    EndPattern
  534.     INC    COUNTER
  535.     MOV    AX,WORD PTR [BPM_SPEED+2]
  536.     ADD    WORD PTR [BPM_COUNT+2],AX
  537.     MOV    AX,WORD PTR [BPM_SPEED]
  538.     ADC    WORD PTR [BPM_COUNT],AX
  539.     JC    JumpPattern
  540.     CMP    BPM_RATE,512
  541.     JB    EndPattern
  542.     CMP    COUNTER,3
  543.     JE    SHORT ClearNotes
  544.     CMP    COUNTER,6
  545.     JE    SetNotes
  546.     JMP    EndPattern
  547. ;-----------------------------------------------------------------------------
  548. ClearNotes:
  549.     CMP    MOD_STAT,0
  550.     JE    SHORT NOT_FINISHED
  551.     MOV    PATT_CURRENT,0
  552.     MOV    DI,OFFSET SAMP_CHANS
  553.     MOV    CX,CH_NUMB
  554. FINISH:    MOV    [DI.OLD_VOL],0
  555.     MOV    [DI.VOL],0
  556.     MOV    [DI.AMIGA],0
  557.     MOV    [DI.FREQ_VAL],0
  558.     ADD    DI,CHAN_SIZE
  559.     LOOP    FINISH
  560. NOT_FINISHED:
  561.     MOV    DI,OFFSET SAMP_CHANS
  562.     MOV    CX,CH_NUMB
  563.     MOV    DX,BASE_PORT
  564.     ADD    DX,CommandPort
  565. StopVoices:
  566.     DEC    DX
  567.     MOV    AL,BYTE PTR CH_NUMB
  568.     SUB    AL,CL
  569.     OUT    DX,AL
  570.     INC    DX
  571.     CMP    [DI.INST_SET],2
  572.     JE    SHORT VoiceOff1
  573.     CMP    [DI.INST_SET],1
  574.     JE    SHORT VoiceOff2
  575.     CMP    [DI.OFFSET_ADD],0
  576.     JNE    SHORT VoiceOff1
  577.     JMP    SHORT NoVoiceOff
  578. VoiceOff2:
  579.     MOV    AX,[DI.CURR_SAMP]
  580.     CMP    AX,[DI.OLD_SAMP]
  581.     JNE    SHORT VoiceOff1
  582.     JMP    SHORT NoVoiceOff
  583. VoiceOff1:
  584.     MOV    AX,[DI.OLD_VOL]
  585.     MOV    [DI.OLD_VOL],0
  586.     MOV    BP,GUS_VOL
  587.     MOV    BX,MUSIC_VOL
  588.     MUL    BL
  589.     MOVZX    BX,AH
  590.     SHL    BX,1
  591.     MOV    BX,[GUS_VOL+BX]
  592.     TEST    US_MODUS,2
  593.     JZ    SHORT WITH_SOUND1
  594.     MOV    BX,1000H
  595.     MOV    BP,BX
  596. WITH_SOUND1:
  597.     CALL    SEND_RAMP
  598. NoVoiceOff:
  599.     ADD    DI,CHAN_SIZE
  600.     LOOP    StopVoices
  601.     CMP    BPM_RATE,512
  602.     JAE    EndPattern
  603. ;-----------------------------------------------------------------------------
  604. SetNotes:
  605.     MOV    COUNTER,1
  606.     MOV    DI,OFFSET SAMP_CHANS
  607.     MOV    CX,CH_NUMB
  608.     MOV    DX,BASE_PORT
  609.     ADD    DX,CommandPort
  610. ChangeSamps:
  611.     DEC    DX
  612.     MOV    AL,BYTE PTR CH_NUMB
  613.     SUB    AL,CL
  614.     OUT    DX,AL
  615.     INC    DX
  616.     MOV    AL,[DI.BALANCE]        ;PANNING
  617.     MOV    AH,AL
  618.     SHR    AL,4
  619.     AND    AH,0FH
  620.     CMP    AL,AH
  621.     JE    SHORT NO_PANNING
  622.     MOV    AL,AH
  623.     SHL    AL,4
  624.     OR    AL,AH
  625.     MOV    [DI.BALANCE],AL
  626.     MOV    AL,VoiceBalance
  627.     OUT    DX,AL
  628.     ADD    DX,2
  629.     MOV    AL,AH
  630.     OUT    DX,AL
  631.     SUB    DX,2
  632. NO_PANNING:
  633.     CMP    [DI.INST_SET],2
  634.     JE    SHORT SampChange1
  635.     CMP    [DI.INST_SET],1
  636.     JE    SHORT SampChange2
  637.     CMP    [DI.OFFSET_ADD],0
  638.     JNE    SHORT ChangeOffset
  639.     JMP    SHORT NoChangeSamp
  640. ChangeOffset:
  641.     CALL    SEND_SAMPLE_START
  642.     JMP    SHORT NoChangeSamp
  643. SampChange1:
  644.     MOV    AH,3
  645.     CALL    SEND_WRITE_VOICE
  646.     CALL    WAIT_PORT
  647.     CALL    SEND_SAMPLE_START
  648.     MOV    AX,[DI.OLD_SAMP]
  649.     CMP    AX,[DI.CURR_SAMP]
  650.     JE    SHORT NoChangeSamp
  651.     CALL    SEND_SAMPLE_END
  652.     CALL    SEND_SAMPLE_LOOP
  653.     MOV    AH,3
  654.     CALL    SEND_WRITE_VOICE
  655.     JMP    SHORT NoChangeSamp
  656. SampChange2:
  657.     MOV    AX,[DI.OLD_SAMP]
  658.     CMP    AX,[DI.CURR_SAMP]
  659.     JE    SHORT NoChangeSamp
  660.     MOV    AL,VoicePosLo
  661.     OUT    DX,AL
  662.     INC    DX
  663.     IN    AX,DX
  664.     MOV    BX,AX
  665.     DEC    DX
  666.     MOV    AL,VoicePosHi
  667.     OUT    DX,AL
  668.     INC    DX
  669.     IN    AX,DX
  670.     DEC    DX
  671.     XCHG    AX,BX
  672.     SHL    AX,7
  673.     SHR    BX,9
  674.     AND    BX,7FH
  675.     OR    AX,BX
  676.     MOV    BX,[DI.OLD_SAMP]
  677.     DEC    BX
  678.     SHL    BX,2
  679.     SUB    AX,WORD PTR [IOFFSET+BX]
  680.     MOV    BX,AX
  681.     CMP    BX,[DI.LEN]
  682.     JB    SHORT NoFixStart
  683.     MOV    BX,[DI.LEN]
  684.     DEC    BX
  685. NoFixStart:
  686.     CMP    [DI.OFFSET_ADD],0
  687.     JNE    SHORT NoOffsetEff
  688.     MOV    [DI.OFFSET_ADD],BX
  689. NoOffsetEff:
  690.     CALL    SEND_SAMPLE_START
  691.     CALL    SEND_SAMPLE_END
  692.     CALL    SEND_SAMPLE_LOOP
  693.     MOV    AH,BYTE PTR [DI.LOOP_ONOFF]
  694.     CALL    SEND_WRITE_VOICE
  695.     CALL    WAIT_PORT
  696. NoChangeSamp:
  697.     MOV    AX,[DI.OLD_VOL]
  698.     MOV    BX,MUSIC_VOL
  699.     MUL    BL
  700.     MOVZX    BX,AH
  701.     SHL    BX,1
  702.     MOV    BX,[GUS_VOL+BX]
  703.     MOV    AX,[DI.VOL]
  704.     MOV    BP,MUSIC_VOL
  705.     MUL    BP
  706.     MOVZX    BP,AH
  707.     SHL    BP,1
  708.     MOV    BP,CS:[GUS_VOL+BP]
  709.     TEST    US_MODUS,2
  710.     JZ    SHORT WITH_SOUND2
  711.     MOV    BX,1000H
  712.     MOV    BP,BX
  713. WITH_SOUND2:
  714.     MOV    DX,BP
  715.     MOV    DL,BH
  716.     CMP    DL,DH
  717.     JNE    SHORT SetVOL
  718.     MOV    DX,BASE_PORT
  719.     ADD    DX,CommandPort
  720.     MOV    AL,VOLumeCtrl
  721.     OUT    DX,AL
  722.     ADD    DX,2
  723.     MOV    AL,3
  724.     OUT    DX,AL
  725.     SUB    DX,2
  726.     MOV    AL,SetVOLume
  727.     OUT    DX,AL
  728.     MOV    AX,BP
  729.     INC    DX
  730.     OUT    DX,AX
  731.     DEC    DX
  732.     JMP    SHORT NoSetVOL
  733. SetVOL:    CALL    SEND_RAMP
  734. NoSetVOL:
  735.     MOV    AL,SetVoiceFreq
  736.     OUT    DX,AL
  737.     INC    DX
  738.     MOV    AX,[DI.FREQ_VAL]
  739.     OUT    DX,AX
  740.     DEC    DX
  741.     SHL    COUNTER,1
  742.     ADD    DI,CHAN_SIZE
  743.     DEC    CX
  744.     JNZ    ChangeSamps
  745.     MOV    DI,OFFSET SAMP_CHANS
  746.     MOV    CX,CH_NUMB
  747. StartVoices:
  748.     DEC    DX
  749.     MOV    AL,BYTE PTR CH_NUMB
  750.     SUB    AL,CL
  751.     OUT    DX,AL
  752.     INC    DX
  753.     CMP    [DI.INST_SET],2
  754.     JNE    SHORT NoVoiceStart
  755.     MOV    AH,BYTE PTR [DI.LOOP_ONOFF]
  756.     CALL    SEND_WRITE_VOICE
  757.     CALL    WAIT_PORT
  758. NoVoiceStart:
  759.     MOV    [DI.INST_SET],0
  760.     MOV    [DI.OFFSET_ADD],0
  761.     ADD    DI,CHAN_SIZE
  762.     LOOP    StartVoices
  763.     JMP    EndPattern
  764. ;-----------------------------------------------------------------------------
  765. JumpPattern:
  766.     MOV    COUNTER,0
  767.     DEC    PATT_COUNT
  768.     JZ    DoPattern
  769.     MOV    DI,OFFSET SAMP_CHANS
  770.     MOV    CX,CH_NUMB
  771. EFFECTLoop:
  772.     MOV    AX,[DI.VOL]
  773.     MOV    [DI.OLD_VOL],AX
  774.     INC    [DI.EFFECT_TIME]
  775.     ADD    [DI.ARP_COUNTER],2
  776.     CMP    [DI.ARP_COUNTER],6
  777.     JB    SHORT NoWrapARP
  778.     MOV    [DI.ARP_COUNTER],0
  779. NoWrapARP:
  780.     MOV    AX,[DI.EFFECT]
  781.     OR    AX,AX
  782.     JZ    NoEFFECT
  783.     MOVZX    BX,AL
  784.     CMP    BL,0EH
  785.     JE    SHORT DoEEFFECTs
  786.     SHL    BX,1
  787.     JMP    [EFFECTJumps+BX]
  788. DoEEFFECTs:
  789.     MOV    BL,AH
  790.     AND    AH,0FH
  791.     SHR    BL,4
  792.     SHL    BX,1
  793.     JMP    [EEFFECTJumps+BX]
  794. ARPeggio:
  795.     MOV    BX,[DI.ARP_COUNTER]
  796.     MOV    BX,[DI.ARP+BX]
  797.     SHL    BX,1
  798.     MOV    AX,[FREQ_TABLE+BX]
  799.     MOV    [DI.FREQ_VAL],AX
  800.     JMP    NoEFFECT
  801. PortUp:    XCHG    AL,AH
  802.     XOR    AH,AH
  803.     MOV    SI,[DI.FINE]
  804.     MOV    BP,[PERIOD_TABLE+47*2+SI]    ;35
  805.     MOV    BX,[DI.AMIGA]
  806.     SUB    BX,AX
  807.     JNC    SHORT NoFix1
  808.     MOV    BX,BP
  809. NoFix1:    CMP    BX,BP
  810.     JAE    SHORT NotSmall1
  811.     MOV    BX,BP
  812. NotSmall1:
  813.     MOV    [DI.AMIGA],BX
  814.     SHL    BX,1
  815.     MOV    AX,[FREQ_TABLE+BX]
  816.     MOV    [DI.FREQ_VAL],AX
  817.     JMP    NoEFFECT
  818. PortDown:
  819.     XCHG    AL,AH
  820.     XOR    AH,AH
  821.     MOV    SI,[DI.FINE]
  822.     MOV    BP,[PERIOD_TABLE+SI]
  823.     MOV    BX,[DI.AMIGA]
  824.     ADD    BX,AX
  825.     CMP    BX,BP
  826.     JBE    SHORT NotBig1
  827.     MOV    BX,BP
  828. NotBig1:
  829.     MOV    [DI.AMIGA],BX
  830.     SHL    BX,1
  831.     MOV    AX,[FREQ_TABLE+BX]
  832.     MOV    [DI.FREQ_VAL],AX
  833.     JMP    NoEFFECT
  834. PORT_TOTone:
  835.     XCHG    AL,AH
  836.     XOR    AH,AH
  837. GOTO_PORT_TO:
  838.     MOV    DX,[DI.PORT_TO]
  839.     MOV    BX,[DI.AMIGA]
  840.     CMP    BX,DX
  841.     JAE    SHORT NoPORT_TOUp
  842.     ADD    BX,AX
  843.     CMP    BX,DX
  844.     JBE    SHORT NoPORT_TOUp
  845.     MOV    [DI.AMIGA],DX
  846. NoPORT_TOUp:
  847.     CMP    BX,DX
  848.     JBE    SHORT NoPORT_TODown
  849.     SUB    BX,AX
  850.     JNC    SHORT NoPORT_TOError
  851.     MOV    BX,DX
  852. NoPORT_TOError:
  853.     CMP    BX,DX
  854.     JAE    SHORT NoPORT_TODown
  855.     MOV    BX,DX
  856. NoPORT_TODown:
  857.     MOV    [DI.AMIGA],BX
  858.     SHL    BX,1
  859.     MOV    AX,[FREQ_TABLE+BX]
  860.     MOV    [DI.FREQ_VAL],AX
  861.     JMP    NoEFFECT
  862. Vibrato:
  863.     MOV    SI,[DI.FINE]
  864.     MOV    BP,[PERIOD_TABLE+47*2+SI]    ;35
  865.     MOV    SI,[PERIOD_TABLE+SI]
  866.     MOV    DL,AH
  867.     AND    AH,0F0H
  868.     SHR    AH,2
  869.     AND    DL,0FH
  870.     MOV    BL,BYTE PTR [DI.VIBRATO_POINT]
  871.     ADD    BL,AH
  872.     MOV    BYTE PTR [DI.VIBRATO_POINT],BL
  873.     SHR    BL,2
  874.     AND    BX,1Fh
  875.     MOV    AL,[SIN_TAB+BX]
  876.     MUL    DL
  877.     ROL    AX,1
  878.     XCHG    AL,AH
  879.     AND    AH,1
  880.     TEST    BYTE PTR [DI.VIBRATO_POINT],80H
  881.     JNE    SHORT VibUp1
  882.     NEG    AX
  883. VibUp1:    ADD    AX,[DI.AMIGA]
  884.     CMP    AX,BP
  885.     JAE    SHORT NoHighVibrato1
  886.     MOV    AX,BP
  887. NoHighVibrato1:
  888.     CMP    AX,SI
  889.     JBE    SHORT NoLowVibrato1
  890.     MOV    AX,SI
  891. NoLowVibrato1:
  892.     SHL    AX,1
  893.     MOV    BX,AX
  894.     MOV    AX,[FREQ_TABLE+BX]
  895.     MOV    [DI.FREQ_VAL],AX
  896.     JMP    NoEFFECT
  897. PORT_TOVSlide:
  898.     MOV    AL,AH
  899.     AND    AH,0FH
  900.     SHR    AL,4
  901.     SUB    AH,AL
  902.     MOV    AL,BYTE PTR [DI.VOL]
  903.     SUB    AL,AH
  904.     JNS    SHORT NoSlideLow2
  905.     XOR    AL,AL
  906. NoSlideLow2:
  907.     CMP    AL,40H
  908.     JBE    SHORT NoSlideHigh2
  909.     MOV    AL,40H
  910. NoSlideHigh2:
  911.     MOV    BYTE PTR [DI.VOL],AL
  912.     MOV    AX,[DI.OLD_PORT_TO]
  913.     JMP    GOTO_PORT_TO
  914. VibratoVSlide:
  915.     MOV    AL,AH
  916.     AND    AH,0FH
  917.     SHR    AL,4
  918.     SUB    AH,AL
  919.     MOV    AL,BYTE PTR [DI.VOL]
  920.     SUB    AL,AH
  921.     JNS    SHORT NoSlideLow3
  922.     XOR    AL,AL
  923. NoSlideLow3:
  924.     CMP    AL,40H
  925.     JBE    SHORT NoSlideHigh3
  926.     MOV    AL,40H
  927. NoSlideHigh3:
  928.     MOV    BYTE PTR [DI.VOL],AL
  929.     JMP    Vibrato
  930. VOLSlide:
  931.     MOV    AL,AH
  932.     AND    AH,0FH
  933.     SHR    AL,4
  934.     OR    AL,AL
  935.     JZ    SHORT NoVOLSlideUp
  936.     NEG    AL
  937.     MOV    AH,AL
  938. NoVOLSlideUp:
  939.     MOV    AL,BYTE PTR [DI.VOL]
  940.     SUB    AL,AH
  941.     JNS    SHORT NoSlideLow1
  942.     XOR    AL,AL
  943. NoSlideLow1:
  944.     CMP    AL,40H
  945.     JBE    SHORT NoSlideHigh1
  946.     MOV    AL,40H
  947. NoSlideHigh1:
  948.     MOV    BYTE PTR [DI.VOL],AL
  949.     JMP    SHORT NoEFFECT
  950. RetrigNote:
  951.     CMP    AH,BYTE PTR [DI.EFFECT_TIME]
  952.     JNE    SHORT NoRetrig
  953.     MOV    [DI.EFFECT_TIME],0
  954.     MOV    [DI.INST_SET],2
  955. NoRetrig:
  956.     JMP    SHORT NoEFFECT
  957. CutNote:
  958.     CMP    AH,BYTE PTR [DI.EFFECT_TIME]
  959.     JNE    SHORT NoCutNote
  960.     MOV    [DI.AMIGA],0
  961.     MOV    [DI.FREQ_VAL],0
  962. NoCutNote:
  963.     JMP    SHORT NoEFFECT
  964. DelayNote:
  965.     CMP    AH,BYTE PTR [DI.EFFECT_TIME]
  966.     JNE    SHORT NoDelayNote
  967.     MOV    [DI.INST_SET],2
  968.     MOV    [DI.VIBRATO_POINT],0
  969.     MOV    BX,[DI.PORT_TO]
  970.     MOV    [DI.AMIGA],BX
  971.     SHL    BX,1
  972.     MOV    BX,[FREQ_TABLE+BX]
  973.     MOV    [DI.FREQ_VAL],BX
  974. NoDelayNote:
  975.     JMP    SHORT NoEFFECT
  976. NoEFFECT:
  977.     ADD    DI,CHAN_SIZE
  978.     DEC    CX
  979.     JNZ    EFFECTLoop
  980.     JMP    EndPattern2
  981. ;-----------------------------------------------------------------------------
  982. DoPattern:
  983.     MOV    AX,PATT_SPEED
  984.     MOV    PATT_COUNT,AX
  985.     CMP    PATT_ROW,64
  986.     JB    SHORT NoPatternWrap
  987.     MOV    AX,PATT_CURRENT
  988.     CMP    AL,SONG_SIZE
  989.     JB    SHORT NoTrackWrap
  990.     MOV    AL,SONG_LOOP
  991.     CMP    AL,SONG_SIZE
  992.     JB    SHORT NoRestart
  993.     MOV    MOD_STAT,3
  994.     XOR    AL,AL
  995. NoRestart:
  996.     MOV    PATT_CURRENT,AX
  997.     MOV    PATT_SPEED,6
  998.     MOV    PATT_COUNT,1
  999.     MOV    AL,125
  1000.     CALL    GO_SETBPM
  1001.     MOV    BPM_COUNT,0
  1002. NoTrackWrap:
  1003.     MOV    BX,PATT_CURRENT
  1004.     INC    PATT_CURRENT
  1005.     MOV    DI,OFFSET SAMP_CHANS
  1006.     XOR    SI,SI
  1007. NewTracks:
  1008.     PUSH    SI
  1009.     SHL    SI,1
  1010.     MOV    SI,[TRACKS_OFFSET+SI]
  1011.     MOV    AX,PATT_BREAK
  1012.     MOV    PATT_ROW,AX
  1013.     SHL    AX,2
  1014.     ADD    AH,[SI+BX]
  1015.     MOV    [DI.TRACK_OFF],AX
  1016.     POP    SI
  1017.     ADD    DI,CHAN_SIZE
  1018.     INC    SI
  1019.     CMP    SI,CH_NUMB
  1020.     JB    NewTracks
  1021.     MOV    PATT_BREAK,0
  1022. NoPatternWrap:
  1023.     MOV    ES,TRACK_SEG
  1024.     MOV    DI,OFFSET SAMP_CHANS
  1025.     MOV    CX,CH_NUMB
  1026. PattLoop:
  1027.     MOV    SI,[DI.TRACK_OFF]
  1028.     MOV    AX,[DI.VOL]
  1029.     MOV    [DI.OLD_VOL],AX
  1030.     MOV    BH,ES:[SI]        ; New Sample
  1031.     MOV    BL,ES:[SI+2]
  1032.     AND    BH,0F0H
  1033.     SHR    BL,4
  1034.     ADD    BL,BH
  1035.     JZ    SHORT NoNewSample
  1036.     MOV    BH,BYTE PTR [DI.CURR_SAMP]
  1037.     MOV    BYTE PTR [DI.OLD_SAMP],BH
  1038.     MOV    BYTE PTR [DI.CURR_SAMP],BL
  1039.     XOR    BH,BH
  1040.     DEC    BX
  1041.     SHL    BX,1
  1042.     MOV    AX,[IVOLUME+BX]
  1043.     MOV    [DI.VOL],AX
  1044.     MOV    [DI.INST_SET],1
  1045.     SHL    BX,1
  1046.     MOV    EAX,[IOFFSET+BX]
  1047.     MOV    [DI.SAMP_OFF],EAX
  1048.     SHR    BX,1
  1049.     MOV    AX,[IFINETUNE+BX]
  1050.     SHL    AX,5
  1051.     MOV    [DI.FINE],AX
  1052.     SHL    AX,1
  1053.     ADD    [DI.FINE],AX
  1054.     MOV    [DI.LOOP_ONOFF],0
  1055.     MOV    AX,[ISIZE+BX]
  1056.     MOV    [DI.LEN],AX
  1057.     MOV    AX,[ILOOP_START+BX]
  1058.     MOV    [DI.REPEAT],AX
  1059.     MOV    AX,[ILOOP_SIZE+BX]
  1060.     MOV    [DI.REPLEN],AX
  1061.     CMP    AX,2
  1062.     JBE    SHORT NoNewSample
  1063.     MOV    [DI.LOOP_ONOFF],8
  1064.     MOV    AX,[DI.REPEAT]
  1065.     ADD    AX,[DI.REPLEN]
  1066.     CMP    AX,[DI.LEN]
  1067.     JA    SHORT NoNewSample
  1068.     MOV    [DI.LEN],AX
  1069. NoNewSample:
  1070.     MOV    BX,ES:[SI]
  1071.     XCHG    BL,BH
  1072.     AND    BX,0FFFH
  1073.     JZ    SHORT NoNewNote
  1074.     CALL    GET_PERIOD_INDEX
  1075.     ADD    BX,[DI.FINE]
  1076.     MOV    BX,[PERIOD_TABLE+BX]
  1077.     MOV    [DI.PORT_TO],BX
  1078.     MOV    AX,ES:[SI+2]
  1079.     AND    AL,0FH
  1080.     AND    AH,0F0H
  1081.     CMP    AL,3
  1082.     JE    SHORT NoNewNote
  1083.     CMP    AL,5
  1084.     JE    SHORT NoNewNote
  1085.     CMP    AX,0D00EH
  1086.     JNE    SHORT NewNote
  1087.     MOV    AL,ES:[SI+2]
  1088.     OR    AL,AL
  1089.     JZ    SHORT NewNote
  1090.     MOV    [DI.INST_SET],0
  1091.     JMP    SHORT NoNewNote
  1092. NewNote:
  1093.     MOV    [DI.INST_SET],2
  1094.     MOV    [DI.VIBRATO_POINT],0
  1095.     MOV    [DI.AMIGA],BX
  1096.     SHL    BX,1
  1097.     MOV    BX,[FREQ_TABLE+BX]
  1098.     MOV    [DI.FREQ_VAL],BX
  1099. NoNewNote:
  1100.     MOV    [DI.ARP_COUNTER],0
  1101.     MOV    AX,ES:[SI+2]
  1102.     AND    AL,0FH
  1103.     MOV    [DI.EFFECT],AX
  1104.     CMP    AL,7
  1105.     JB    SHORT NoSetOldFreq
  1106.     MOV    BX,AX
  1107.     AND    BH,0F0H
  1108.     CMP    BX,0C00EH
  1109.     JE    SHORT NoSetOldFreq
  1110.     CMP    BX,0D00EH
  1111.     JE    SHORT NoSetOldFreq
  1112.     MOV    BX,[DI.AMIGA]
  1113.     SHL    BX,1
  1114.     MOV    BX,[FREQ_TABLE+BX]
  1115.     MOV    [DI.FREQ_VAL],BX
  1116. NoSetOldFreq:
  1117.     MOVZX    BX,AL
  1118.     CMP    BL,0EH
  1119.     JE    SHORT DoEPattEFFECTs
  1120.     SHL    BX,1
  1121.     JMP    [PattJumps+BX]
  1122. DoEPattEFFECTs:
  1123.     MOV    BL,AH
  1124.     AND    AH,0FH
  1125.     SHR    BL,4
  1126.     SHL    BX,1
  1127.     JMP    [EPattJumps+BX]
  1128. ARPeggioFix:
  1129.     MOV    BX,[DI.AMIGA]
  1130.     CALL    GET_PERIOD_INDEX
  1131.     MOV    BP,BX
  1132.     ADD    BX,[DI.FINE]
  1133.     MOV    DX,[PERIOD_TABLE+BX]
  1134.     MOV    [DI.ARP],DX
  1135.     XCHG    AL,AH
  1136.     XOR    AH,AH
  1137.     MOV    DX,AX
  1138.     SHR    DX,4
  1139.     AND    AX,0FH
  1140.     SHL    DX,1
  1141.     SHL    AX,1
  1142.     MOV    BX,BP
  1143.     ADD    BX,DX
  1144.     CMP    BX,94
  1145.     JBE    SHORT NoWrapARP1
  1146.     MOV    BX,94
  1147. NoWrapARP1:
  1148.     ADD    BX,[DI.FINE]
  1149.     MOV    DX,[PERIOD_TABLE+BX]
  1150.     MOV    [DI.ARP+2],DX
  1151.     MOV    BX,BP
  1152.     ADD    BX,AX
  1153.     CMP    BX,94
  1154.     JBE    SHORT NoWrapARP2
  1155.     MOV    BX,94
  1156. NoWrapARP2:
  1157.     ADD    BX,[DI.FINE]
  1158.     MOV    DX,[PERIOD_TABLE+BX]
  1159.     MOV    [DI.ARP+4],DX
  1160.     JMP    NoPattEFFECT
  1161. PORT_TOFix:
  1162.     OR    AH,AH
  1163.     JNZ    SHORT NoPortPekFix
  1164.     MOV    AH,BYTE PTR [DI.OLD_PORT_TO]
  1165. NoPortPekFix:
  1166.     MOV    BYTE PTR [DI.OLD_PORT_TO],AH
  1167.     MOV    BYTE PTR [DI.EFFECT+1],AH
  1168.     JMP    NoPattEFFECT
  1169. VibratoFix:
  1170.     MOV    AL,AH
  1171.     AND    AL,0FH
  1172.     AND    AH,0F0H
  1173.     OR    AL,AL
  1174.     JNZ    SHORT NoVibratoFix1
  1175.     MOV    AL,BYTE PTR [DI.OLD_VIBRATO]
  1176. NoVibratoFix1:
  1177.     OR    AH,AH
  1178.     JNZ    SHORT NoVibratoFix2
  1179.     MOV    AH,BYTE PTR [DI.OLD_VIBRATO+1]
  1180. NoVibratoFix2:
  1181.     MOV    BYTE PTR [DI.OLD_VIBRATO],AL
  1182.     MOV    BYTE PTR [DI.OLD_VIBRATO+1],AH
  1183.     OR    AL,AH
  1184.     MOV    BYTE PTR [DI.EFFECT+1],AL
  1185.     JMP    NoPattEFFECT
  1186. SampleOff:
  1187.     XOR    AL,AL
  1188.     CMP    AX,[DI.LEN]
  1189.     JB    SHORT NoFixOffset
  1190.     MOV    AX,[DI.LEN]
  1191.     DEC    AX
  1192. NoFixOffset:
  1193.     MOV    [DI.OFFSET_ADD],AX
  1194.     JMP    NoPattEFFECT
  1195. PosJump:
  1196.     MOV    [PATT_ROW],63
  1197.     MOV    BYTE PTR [PATT_CURRENT],AH
  1198.     JMP    NoPattEFFECT
  1199. VOLume:
  1200.     CMP    AH,40H
  1201.     JBE    SHORT NoFixVOL1
  1202.     MOV    AH,40H
  1203. NoFixVOL1:
  1204.     MOV    BYTE PTR [DI.VOL],AH
  1205.     JMP    NoPattEFFECT
  1206. BreakPatt:
  1207.     MOV    [PATT_ROW],63
  1208.     CMP    AH,64H
  1209.     JB    SHORT NoFixBreak
  1210.     MOV    AH,63H
  1211. NoFixBreak:
  1212.     MOV    AL,AH
  1213.     AND    AL,0FH
  1214.     SHR    AH,4
  1215.     SHL    AH,1
  1216.     MOV    BYTE PTR [PATT_BREAK],AL
  1217.     ADD    BYTE PTR [PATT_BREAK],AH
  1218.     SHL    AH,2
  1219.     ADD    BYTE PTR [PATT_BREAK],AH
  1220.     JMP    NoPattEFFECT
  1221. SpeedSet:
  1222.     OR    AH,AH
  1223.     JZ    NoPattEFFECT
  1224.     CMP    AH,1FH
  1225.     JBE    SHORT UsualSpeed
  1226.     XCHG    AL,AH
  1227.     CALL    GO_SETBPM
  1228.     JMP    SHORT NoPattEFFECT
  1229. UsualSpeed:
  1230.     MOV    BYTE PTR [PATT_SPEED],AH
  1231.     MOV    BYTE PTR [PATT_COUNT],AH
  1232.     JMP    SHORT NoPattEFFECT
  1233. FINEPortUp:
  1234.     XCHG    AL,AH
  1235.     XOR    AH,AH
  1236.     SUB    [DI.AMIGA],AX
  1237.     MOV    BX,[DI.FINE]
  1238.     MOV    BX,[PERIOD_TABLE+47*2+BX] ;35
  1239.     CMP    [DI.AMIGA],BX
  1240.     JAE    SHORT NoFixFINEUp
  1241.     MOV    [DI.AMIGA],BX
  1242. NoFixFINEUp:
  1243.     JMP    SHORT NoPattEFFECT
  1244. FINEPortDown:
  1245.     XCHG    AL,AH
  1246.     XOR    AH,AH
  1247.     ADD    [DI.AMIGA],AX
  1248.     MOV    BX,[DI.FINE]
  1249.     MOV    BX,[PERIOD_TABLE+BX]
  1250.     CMP    [DI.AMIGA],BX
  1251.     JBE    SHORT NoFixFINEDown
  1252.     MOV    [DI.AMIGA],BX
  1253. NoFixFINEDown:
  1254.     JMP    SHORT NoPattEFFECT
  1255. PANNING:
  1256.     AND    [DI.BALANCE],0F0H
  1257.     OR    [DI.BALANCE],AH
  1258.     JMP    SHORT NoPattEFFECT
  1259. FINEVOLUP:
  1260.     ADD    BYTE PTR [DI.VOL],AH
  1261.     CMP    BYTE PTR [DI.VOL],40H
  1262.     JBE    SHORT NoFixFINEVOLUp
  1263.     MOV    BYTE PTR [DI.VOL],40H
  1264. NoFixFINEVOLUp:
  1265.     JMP    SHORT NoPattEFFECT
  1266. FINEVOLDown:
  1267.     SUB    BYTE PTR [DI.VOL],AH
  1268.     JNC    SHORT NoFixFINEVOLDown
  1269.     MOV    BYTE PTR [DI.VOL],0
  1270. NoFixFINEVOLDown:
  1271.     JMP    SHORT NoPattEFFECT
  1272. NoPattEFFECT:
  1273.     ADD    [DI.TRACK_OFF],4
  1274.     MOV    [DI.EFFECT_TIME],0
  1275.     ADD    DI,CHAN_SIZE
  1276.     DEC    CX
  1277.     JNZ    PattLoop
  1278.     INC    PATT_ROW
  1279. EndPattern2:
  1280.     CMP    BPM_RATE,512
  1281.     JB    ClearNotes
  1282. EndPattern:
  1283.     CALL    CONTROL_SAMPLE
  1284.     POP    ES DS
  1285.     POP    EBP EDI ESI EDX ECX EBX EAX
  1286.     CMP    CS:VAR_BUFSEG,0
  1287.     JNE    SHORT WT8
  1288.     CMP    CS:SYSTEM,0
  1289.     JE    SHORT WT7
  1290.     DEC    CS:IRQCOUNT
  1291.     JNZ    SHORT WT7
  1292.     MOV    CS:IRQCOUNT,56
  1293. WT8:    JMP    DWORD PTR CS:[HOLD70]
  1294. WT7:    IRET
  1295. CONTROL_CHANNELS ENDP
  1296. ;-----------------------------------------------------------------------------
  1297. GET_PERIOD_INDEX PROC NEAR
  1298.     MOV    BP,BX
  1299.     XOR    BH,BH
  1300.     MOV    DX,6000H        ;BINAERSUCHE
  1301. LGP1:    MOV    BL,DL
  1302.     ADD    BL,DH
  1303.     SHR    BL,1
  1304.     AND    BL,0FEH
  1305.     JZ    SHORT GGP2
  1306.     CMP    BL,94
  1307.     JE    SHORT GGP2
  1308.     CMP    BP,[PERIOD_TABLE+BX]
  1309.     JAE    SHORT GGP1
  1310.     MOV    DL,BL
  1311.     JMP    LGP1
  1312. GGP1:    MOV    DH,BL
  1313.     CMP    BP,[PERIOD_TABLE-2+BX]
  1314.     JAE    LGP1            ;GEFUNDEN
  1315.     MOV    DX,[PERIOD_TABLE-2+BX]    ;GET NEAREST PERIOD
  1316.     SUB    DX,BP
  1317.     SUB    BP,[PERIOD_TABLE+BX]
  1318.     CMP    DX,BP
  1319.     JAE    SHORT GGP2
  1320.     SUB    BX,2
  1321. GGP2:    RET
  1322. GET_PERIOD_INDEX ENDP
  1323. ;-----------------------------------------------------------------------------
  1324. GO_SETBPM PROC NEAR
  1325.     XOR    AH,AH
  1326.     MOV    BPM_VALUE,AX
  1327.     SHL    AX,1
  1328.     MOV    BL,5            ; Denna bit är för att ställa
  1329.     DIV    BL            ; EFFECTs till annat än 50Hz
  1330.     MOV    DL,AL            ; Detta ger automatiskt en annan
  1331.     XOR    DH,DH            ; PATT_SPEED.; Hz=2*BPM/5
  1332.     XOR    AX,AX
  1333.     MOV    BX,BPM_RATE
  1334.     CMP    BX,DX
  1335.     JA    SHORT GOSBPM
  1336.     MOV    BX,DX
  1337.     INC    BX
  1338. GOSBPM:    DIV    BX
  1339.     MOV    WORD PTR BPM_SPEED,AX
  1340.     XOR    AX,AX
  1341.     DIV    BX
  1342.     MOV    WORD PTR BPM_SPEED+2,AX
  1343.     RET
  1344. GO_SETBPM ENDP
  1345. ;-----------------------------------------------------------------------------
  1346. CONTROL_SAMPLE PROC NEAR
  1347.     MOV    CL,8
  1348.     XOR    SI,SI
  1349. LCS1:    CMP    [SAM_COUNT+SI],0
  1350.     JE    SHORT GCS1
  1351.     JL    SHORT GCS2
  1352.     DEC    [SAM_COUNT+SI]
  1353.     JNZ    SHORT GCS1
  1354.     MOV    [SAM_COUNT+SI],-256    ;RAMP DOWN SAMPLE
  1355.     MOV    DX,BASE_PORT
  1356.     ADD    DX,CommandPort
  1357.     DEC    DX
  1358.     MOV    AL,CL
  1359.     OUT    DX,AL
  1360.     INC    DX
  1361.     MOV    BP,GUS_VOL
  1362.     MOV    BX,FX_VOL
  1363.     INC    BX
  1364.     SHR    BX,2
  1365.     CMP    BL,40H
  1366.     JBE    SHORT FIXVOL
  1367.     MOV    BL,40H
  1368. FIXVOL:    SHL    BX,1
  1369.     MOV    BX,[GUS_VOL+BX]
  1370.     CALL    SEND_RAMP
  1371.     JMP    SHORT GCS1
  1372. GCS2:    INC    [SAM_COUNT+SI]        ;STOP SAMPLE
  1373.     JNZ    SHORT GCS1
  1374.     MOV    DX,BASE_PORT
  1375.     ADD    DX,ActiveVoicePort
  1376.     MOV    AL,CL
  1377.     OUT    DX,AL
  1378.     INC    DX
  1379.     MOV    AL,WriteVoiceMode
  1380.     OUT    DX,AL
  1381.     ADD    DX,2
  1382.     MOV    AL,3            ;Voice Off
  1383.     OUT    DX,AL
  1384.     SUB    DX,2
  1385.     MOV    AL,VolumeCtrl
  1386.     OUT    DX,AL
  1387.     ADD    DX,2
  1388.     MOV    AL,3            ;Ramp Off
  1389.     OUT    DX,AL
  1390.     SUB    DX,3
  1391. GCS1:    INC    SI
  1392.     INC    SI
  1393.     INC    CL
  1394.     CMP    CL,NumVoices-1
  1395.     JB    LCS1
  1396.     RET
  1397. CONTROL_SAMPLE ENDP
  1398. ;=============================================================================
  1399.  
  1400.  
  1401. ;=============================================================================
  1402. ;
  1403. ; ULTRASOUND INIT
  1404. ;
  1405. ;=============================================================================
  1406. INIT_DEVICE PROC NEAR
  1407.     PUSH    CS
  1408.     POP    DS
  1409.     CLI
  1410.     MOV    BX,BASE_PORT        ;Init the UltraSound
  1411.     MOV    CX,BX
  1412.     ADD    BX,CommandPort
  1413.     ADD    CX,DataHighPort
  1414.     MOV    DX,BX
  1415.     MOV    AL,Initialize
  1416.     OUT    DX,AL
  1417.     MOV    DX,CX
  1418.     MOV    AL,0
  1419.     OUT    DX,AL
  1420.     MOV    DX,BASE_PORT
  1421.     MOV    AH,10
  1422. LID1:    IN    AL,DX
  1423.     DEC    AH
  1424.     JNZ    LID1
  1425.     MOV    DX,BX
  1426.     MOV    AL,Initialize
  1427.     OUT    DX,AL
  1428.     MOV    DX,CX
  1429.     MOV    AL,1
  1430.     OUT    DX,AL
  1431.     MOV    DX,BASE_PORT
  1432.     MOV    AH,10
  1433. LID2:    IN    AL,DX
  1434.     DEC    AH
  1435.     JNZ    LID2
  1436.     MOV    DX,BX
  1437.     MOV    AL,DMACtrl
  1438.     OUT    DX,AL
  1439.     MOV    DX,CX
  1440.     MOV    AL,0
  1441.     OUT    DX,AL
  1442.     MOV    DX,BX
  1443.     MOV    AL,45H
  1444.     OUT    DX,AL
  1445.     MOV    DX,CX
  1446.     MOV    AL,0
  1447.     OUT    DX,AL
  1448.     MOV    DX,BX
  1449.     MOV    AL,49H
  1450.     OUT    DX,AL
  1451.     MOV    DX,CX
  1452.     MOV    AL,0
  1453.     OUT    DX,AL
  1454.  
  1455.     MOV    DX,BX
  1456.     MOV    AL,VoicesActive
  1457.     OUT    DX,AL
  1458.     MOV    DX,CX
  1459.     MOV    AL,NumVoices
  1460.     DEC    AL
  1461.     OR    AL,0C0H
  1462.     OUT    DX,AL
  1463.  
  1464.     MOV    DX,BASE_PORT        ;Clear IRQs
  1465.     ADD    DX,StatusPort
  1466.     IN    AL,DX
  1467.     MOV    DX,BX
  1468.     MOV    AL,DMACtrl
  1469.     OUT    DX,AL
  1470.     MOV    DX,CX
  1471.     IN    AL,DX
  1472.     MOV    DX,BX
  1473.     MOV    AL,49H
  1474.     OUT    DX,AL
  1475.     MOV    DX,CX
  1476.     IN    AL,DX
  1477.     MOV    DX,BX
  1478.     MOV    AL,8FH
  1479.     OUT    DX,AL
  1480.     MOV    DX,CX
  1481.     IN    AL,DX
  1482.  
  1483.     PUSH    CX
  1484.     MOV    CX,32
  1485. VoiceClearLoop:
  1486.     MOV    DX,BASE_PORT
  1487.     ADD    DX,ActiveVoicePort
  1488.     MOV    AL,CL
  1489.     DEC    AL
  1490.     OUT    DX,AL
  1491.     INC    DX
  1492.     MOV    AL,0
  1493.     OUT    DX,AL
  1494.     ADD    DX,2
  1495.     MOV    AL,3            ;Voice Off
  1496.     OUT    DX,AL
  1497.     SUB    DX,2
  1498.     MOV    AL,0DH
  1499.     OUT    DX,AL
  1500.     ADD    DX,2
  1501.     MOV    AL,3            ;Ramp Off
  1502.     OUT    DX,AL
  1503.     MOV    DX,BASE_PORT
  1504.     MOV    AH,10
  1505. LID3:    IN    AL,DX
  1506.     DEC    AH
  1507.     JNZ    LID3
  1508.     LOOP    VoiceClearLoop
  1509.     POP    CX
  1510.  
  1511.     CMP    DMA_CHANNEL,0        ;NO DMA
  1512.     JE    SHORT LID5
  1513.     MOV    DX,BASE_PORT        ;SETUP FOR DIGITAL ASIC
  1514.     ADD    DX,0FH
  1515.     MOV    AL,5
  1516.     OUT    DX,AL
  1517.     SUB    DX,0FH
  1518.     MOV    AL,3
  1519.     OUT    DX,AL
  1520.     ADD    DX,DMASetPort
  1521.     MOV    AL,0
  1522.     OUT    DX,AL
  1523.     ADD    DX,0FH-DMASetPort
  1524.     OUT    DX,AL
  1525.     SUB    DX,0FH
  1526.     MOV    AL,3            ;SET DMA CHANNEL
  1527.     OUT    DX,AL
  1528.     ADD    DX,DMASetPort
  1529.     PUSH    BX
  1530.     MOV    BX,DMA_CHANNEL
  1531.     MOV    AL,[DMA_SET_DATA+BX]
  1532.     POP    BX
  1533.     OR    AL,0C0H            ;SET DMA
  1534.     OUT    DX,AL
  1535.     SUB    DX,DMASetPort
  1536.     PUSH    AX
  1537.     MOV    AL,43H
  1538.     OUT    DX,AL
  1539.     ADD    DX,DMASetPort
  1540.     MOV    AL,45H            ;SET IRQ11
  1541.     OUT    DX,AL
  1542.     SUB    DX,DMASetPort
  1543.     MOV    AL,3
  1544.     OUT    DX,AL
  1545.     ADD    DX,DMASetPort
  1546.     POP    AX
  1547.     AND    AL,7FH            ;SET DMA
  1548.     OUT    DX,AL
  1549.     SUB    DX,DMASetPort
  1550.     MOV    AL,43H
  1551.     OUT    DX,AL
  1552.     ADD    DX,DMASetPort
  1553.     MOV    AL,45H            ;SET IRQ11
  1554.     OUT    DX,AL
  1555.     ADD    DX,ActiveVoicePort-DMASetPort
  1556.     MOV    AL,0
  1557.     OUT    DX,AL
  1558.     SUB    DX,ActiveVoicePort
  1559.     MOV    AL,8            ;SETUP DMA LATCH
  1560.     OUT    DX,AL
  1561.     ADD    DX,ActiveVoicePort
  1562.     MOV    AL,0
  1563.     OUT    DX,AL
  1564. LID5:
  1565.     MOV    DX,BX            ;Clear IRQs
  1566.     MOV    AL,DMACtrl
  1567.     OUT    DX,AL
  1568.     MOV    DX,CX
  1569.     IN    AL,DX
  1570.     MOV    DX,BX
  1571.     MOV    AL,49H
  1572.     OUT    DX,AL
  1573.     MOV    DX,CX
  1574.     IN    AL,DX
  1575.     MOV    DX,BX
  1576.     MOV    AL,8FH
  1577.     OUT    DX,AL
  1578.     MOV    DX,CX
  1579.     IN    AL,DX
  1580.  
  1581.     MOV    DX,BX
  1582.     MOV    AL,Initialize
  1583.     OUT    DX,AL
  1584.     MOV    DX,CX
  1585.     MOV    AL,3
  1586.     OUT    DX,AL
  1587.  
  1588.     MOV    CX,NumVoices
  1589. SetRampRateLoop:
  1590.     MOV    DX,BASE_PORT
  1591.     ADD    DX,ActiveVoicePort
  1592.     MOV    AL,NumVoices
  1593.     SUB    AL,CL
  1594.     OUT    DX,AL
  1595.  
  1596.     MOV    DX,BASE_PORT
  1597.     ADD    DX,CommandPort
  1598.     MOV    AL,VOLRampRate
  1599.     OUT    DX,AL
  1600.     MOV    AL,00111111B
  1601.     MOV    DX,BASE_PORT
  1602.     ADD    DX,DataHighPort
  1603.     OUT    DX,AL
  1604.  
  1605.     MOV    DX,BASE_PORT
  1606.     ADD    DX,CommandPort
  1607.     MOV    AL,SetVOLume
  1608.     OUT    DX,AL
  1609.     MOV    AX,GUS_VOL
  1610.     MOV    DX,BASE_PORT
  1611.     ADD    DX,DataLowPort
  1612.     OUT    DX,AX
  1613.     MOV    DX,BASE_PORT
  1614.     MOV    AH,10
  1615. LID4:    IN    AL,DX
  1616.     DEC    AH
  1617.     JNZ    LID4
  1618.     LOOP    SetRampRateLoop
  1619.  
  1620.     MOV    DX,BASE_PORT        ;DETECT GUS VERSION
  1621.     ADD    DX,GUS_VERSION
  1622.     IN    AL,DX
  1623.     CMP    ULTRA16,0        ;IST ULTRA16 BOARD ANGEGEBEN?
  1624.     JNE    SHORT LID9
  1625.     CMP    AL,5            ;GUS BEFORE 3.7 NO MIXER
  1626.     JL    SHORT LID6
  1627.     CMP    AL,10
  1628.     JB    SHORT LID7        ;NON GUS MAX
  1629. LID9:    CMP    AL,10
  1630.     JB    SHORT LID8
  1631.     ADD    DX,ICMIX_DATA-ICMIX_SEL    ;ACTIVATE GUS MAX MIXER OUTPUT
  1632.     MOV    AX,CODEC_PORT
  1633.     SHR    AL,4
  1634.     OR    AL,40H
  1635.     OUT    DX,AL
  1636. LID8:    MOV    DX,CODEC_PORT        ;CODEC MIXER ON GUS MAX 31-0
  1637.     MOV    AH,8            ;NO GAIN, KEINE VERSTAERKUNG
  1638.     MOV    AL,2            ;GF1 LEFT CHANNEL
  1639.     OUT    DX,AL
  1640.     INC    DX
  1641.     MOV    AL,AH
  1642.     OUT    DX,AL
  1643.     DEC    DX
  1644.     MOV    AL,3            ;GF1 RIGHT CHANNEL
  1645.     OUT    DX,AL
  1646.     INC    DX
  1647.     MOV    AL,AH
  1648.     OUT    DX,AL
  1649.     DEC    DX
  1650.     XOR    AH,AH
  1651.     MOV    AL,6            ;OUT LEFT CHANNEL
  1652.     OUT    DX,AL
  1653.     INC    DX
  1654.     MOV    AL,AH
  1655.     OUT    DX,AL
  1656.     DEC    DX
  1657.     MOV    AL,7            ;OUT RIGHT CHANNEL
  1658.     OUT    DX,AL
  1659.     INC    DX
  1660.     MOV    AL,AH
  1661.     OUT    DX,AL
  1662. LID7:    MOV    AH,BYTE PTR MUSIC_VOL
  1663.     CALL    SET_CDMIXER
  1664. LID6:    STI
  1665.     RET
  1666. INIT_DEVICE ENDP
  1667. ;-----------------------------------------------------------------------------
  1668. SEND_SAMPLE_START PROC NEAR
  1669.     MOV    AL,SampleStartLo
  1670.     OUT    DX,AL
  1671.     INC    DX
  1672.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1673.     MOV    BP,WORD PTR [DI.SAMP_OFF+2]
  1674.     ADD    AX,[DI.OFFSET_ADD]
  1675.     ADC    BP,0
  1676.     SHR    AX,7
  1677.     SHL    BP,9
  1678.     OR    AX,BP
  1679.     OUT    DX,AX
  1680.     DEC    DX
  1681.     MOV    AL,SampleStartHi
  1682.     OUT    DX,AL
  1683.     INC    DX
  1684.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1685.     ADD    AX,[DI.OFFSET_ADD]
  1686.     SHL    AX,9
  1687.     OUT    DX,AX
  1688.     DEC    DX
  1689.     SUB    DX,CommandPort
  1690.     Rept    6
  1691.     IN    AL,DX
  1692.     EndM
  1693.     ADD    DX,CommandPort
  1694.     RET
  1695. SEND_SAMPLE_START ENDP
  1696. ;-----------------------------------------------------------------------------
  1697. SEND_SAMPLE_END PROC NEAR
  1698.     MOV    AL,SampleEndLo
  1699.     OUT    DX,AL
  1700.     INC    DX
  1701.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1702.     MOV    BP,WORD PTR [DI.SAMP_OFF+2]
  1703.     ADD    AX,[DI.LEN]
  1704.     ADC    BP,0
  1705.     SHR    AX,7
  1706.     SHL    BP,9
  1707.     OR    AX,BP
  1708.     OUT    DX,AX
  1709.     DEC    DX
  1710.     MOV    AL,SampleEndHi
  1711.     OUT    DX,AL
  1712.     INC    DX
  1713.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1714.     ADD    AX,[DI.LEN]
  1715.     SHL    AX,9
  1716.     OUT    DX,AX
  1717.     DEC    DX
  1718.     RET
  1719. SEND_SAMPLE_END ENDP
  1720. ;-----------------------------------------------------------------------------
  1721. SEND_SAMPLE_LOOP PROC NEAR
  1722.     MOV    AL,LoopStartLo
  1723.     OUT    DX,AL
  1724.     INC    DX
  1725.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1726.     MOV    BP,WORD PTR [DI.SAMP_OFF+2]
  1727.     ADD    AX,[DI.REPEAT]
  1728.     ADC    BP,0
  1729.     SHR    AX,7
  1730.     SHL    BP,9
  1731.     OR    AX,BP
  1732.     OUT    DX,AX
  1733.     DEC    DX
  1734.     MOV    AL,LoopStartHi
  1735.     OUT    DX,AL
  1736.     INC    DX
  1737.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1738.     ADD    AX,[DI.REPEAT]
  1739.     SHL    AX,9
  1740.     OUT    DX,AX
  1741.     DEC    DX
  1742.     RET
  1743. SEND_SAMPLE_LOOP ENDP
  1744. ;-----------------------------------------------------------------------------
  1745. SEND_WRITE_VOICE PROC NEAR
  1746.     MOV    AL,WriteVoiceMode
  1747.     OUT    DX,AL
  1748.     ADD    DX,2
  1749.     MOV    AL,AH
  1750.     OUT    DX,AL
  1751.     SUB    DX,2
  1752.     RET
  1753. SEND_WRITE_VOICE ENDP
  1754. ;-----------------------------------------------------------------------------
  1755. WAIT_PORT PROC NEAR
  1756.     SUB    DX,CommandPort
  1757.     Rept    6
  1758.     IN    AL,DX
  1759.     EndM
  1760.     ADD    DX,CommandPort
  1761.     RET
  1762. WAIT_PORT ENDP
  1763. ;-----------------------------------------------------------------------------
  1764. SEND_RAMP PROC NEAR
  1765.     MOV    DX,BASE_PORT
  1766.     ADD    DX,CommandPort
  1767.     MOV    AL,VOLumeCtrl
  1768.     OUT    DX,AL
  1769.     ADD    DX,2
  1770.     MOV    AL,3
  1771.     OUT    DX,AL
  1772.     SUB    DX,2
  1773.     MOV    AH,0
  1774.     CMP    BX,BP
  1775.     JB    SHORT NoFixVOLDir
  1776.     MOV    AH,01000000B
  1777.     XCHG    BX,BP
  1778. NoFixVOLDir:
  1779.     MOV    AL,VOLRampStart
  1780.     OUT    DX,AL
  1781.     XCHG    AX,BX
  1782.     INC    DX
  1783.     OUT    DX,AX
  1784.     DEC    DX
  1785.     MOV    AL,VOLRampEnd
  1786.     OUT    DX,AL
  1787.     MOV    AX,BP
  1788.     INC    DX
  1789.     OUT    DX,AX
  1790.     DEC    DX
  1791.     MOV    AL,VOLumeCtrl
  1792.     OUT    DX,AL
  1793.     MOV    AL,BH
  1794.     ADD    DX,2
  1795.     OUT    DX,AL
  1796.     SUB    DX,2
  1797.     RET
  1798. SEND_RAMP ENDP
  1799. ;-----------------------------------------------------------------------------
  1800. ; CX= ANZAHL WORDS, EDI= GUSMEM ZEIGER, BX= 0000H AMIGA, 8080H PC SAMPLE
  1801. ; DS:SI= ZEIGER AUF SAMPLE-DATEN
  1802. ;-----------------------------------------------------------------------------
  1803. SEND_SAMPLE_DATA PROC NEAR
  1804.     CMP    CS:DMA_CHANNEL,0
  1805.     JNE    DMA_INIT
  1806.     MOV    DX,CS:BASE_PORT
  1807.     ADD    DX,CommandPort
  1808. LHP1:    LODSW
  1809.     CLI
  1810.     XOR    AX,BX
  1811.     MOV    BP,AX
  1812.     MOV    AL,DRAMAddrLo
  1813.     OUT    DX,AL
  1814.     INC    DX
  1815.     MOV    AX,DI
  1816.     OUT    DX,AX
  1817.     DEC    DX
  1818.     MOV    AL,DRAMAddrHi
  1819.     OUT    DX,AL
  1820.     ADD    DX,2
  1821.     MOV    EAX,EDI
  1822.     SHR    EAX,16
  1823.     OUT    DX,AL
  1824.     ADD    DX,2
  1825.     MOV    AX,BP
  1826.     OUT    DX,AL
  1827.     SUB    DX,4
  1828.     INC    EDI
  1829.     MOV    AL,DRAMAddrLo
  1830.     OUT    DX,AL
  1831.     INC    DX
  1832.     MOV    AX,DI
  1833.     OUT    DX,AX
  1834.     DEC    DX
  1835.     MOV    AL,DRAMAddrHi
  1836.     OUT    DX,AL
  1837.     ADD    DX,2
  1838.     MOV    EAX,EDI
  1839.     SHR    EAX,16
  1840.     OUT    DX,AL
  1841.     ADD    DX,2
  1842.     MOV    AX,BP
  1843.     MOV    AL,AH
  1844.     OUT    DX,AL
  1845.     SUB    DX,4
  1846.     INC    EDI
  1847.     STI
  1848.     LOOP    LHP1
  1849.     CLI
  1850.     MOV    AL,DRAMAddrLo        ;SAMPLE UM EIN WORD VERLÄNGERN
  1851.     OUT    DX,AL
  1852.     INC    DX
  1853.     MOV    AX,DI
  1854.     OUT    DX,AX
  1855.     DEC    DX
  1856.     MOV    AL,DRAMAddrHi
  1857.     OUT    DX,AL
  1858.     ADD    DX,2
  1859.     MOV    EAX,EDI
  1860.     SHR    EAX,16
  1861.     OUT    DX,AL
  1862.     ADD    DX,2
  1863.     MOV    AX,BP
  1864.     MOV    AL,AH
  1865.     OUT    DX,AL
  1866.     SUB    DX,4
  1867.     INC    EDI
  1868.     MOV    CS:GUS_MEM,EDI
  1869.     STI
  1870.     RET
  1871. SEND_SAMPLE_DATA ENDP
  1872. ;-----------------------------------------------------------------------------
  1873. ; SET DMA READY FOR TRANSFER WITH AUTOINIT
  1874. ; IN: DS:SI= BLOCKPOINTER, CX= SIZE IN WORDS, EDI, BX WIE OBEN
  1875. ;-----------------------------------------------------------------------------
  1876. DMA_INIT PROC NEAR
  1877.     MOV    DX,CS:BASE_PORT        ;STOP GUS DMA & CLEAR ALL PENDING IRQs
  1878.     ADD    DX,CommandPort
  1879.     MOV    AL,DMACtrl
  1880.     OUT    DX,AL
  1881.     INC    DX
  1882.     INC    DX
  1883.     IN    AL,DX            ;CLEAR IRQ, BUT MASTER IRQ IS DISABLED
  1884.     MOV    DX,CS:BASE_PORT        ;THERE HAPPENED NO IRQ
  1885.     ADD    DX,StatusPort
  1886.     IN    AL,DX
  1887.     MOV    BP,CS:DMA_CHANNEL
  1888. ;    MOVZX    DX,CS:[DMA_RESET+BP]    ;CASCADED DMA2 (MASTER) RESET
  1889. ;    OUT    DX,AL            ;RESET AUF MASTER DMA LOESCHT CASCADE
  1890.     CMP    BP,4
  1891.     JAE    SHORT NO_RESET1
  1892.     MOVZX    DX,CS:[DMA_RESET]    ;DMA1 (SLAVE) MASTER CLEAR
  1893.     OUT    DX,AL
  1894. NO_RESET1:
  1895.     MOV    BP,BX
  1896.     MOVZX    EAX,CX            ;CHECK 256K GUS DRAM BOUNDARY
  1897.     SHL    EAX,1            ;BECAUSE DMA IS NOT ABLE TO CROSS
  1898.     INC    EAX            ;1 WORD LÄNGER-1 BYTE IST LETZTES BYTE
  1899.     ADD    EAX,EDI
  1900.     SHR    EAX,18
  1901.     MOV    EDX,EDI
  1902.     SHR    EDX,18
  1903.     CMP    EAX,EDX
  1904.     JE    SHORT DMA_NORMAL
  1905.     PUSH    SI CX
  1906.     SHL    EAX,18
  1907.     SUB    EAX,EDI
  1908.     MOV    CX,AX
  1909.     SHR    CX,1
  1910.     PUSH    CX
  1911.     DEC    CX
  1912.     CALL    DMA_PORTION        ;FIRST PORTION
  1913.     POP    AX CX SI
  1914.     SUB    CX,AX
  1915.     ADD    SI,AX
  1916.     ADD    SI,AX            ;REST: CORRECT OFFSET & SIZE
  1917. DMA_NORMAL:
  1918.     MOV    BX,CX            ;SAMPLE UM EIN WORD VERLÄNGERN
  1919.     SHL    BX,1
  1920.     DEC    BX
  1921.     MOV    AL,[SI+BX]
  1922.     MOV    AH,AL
  1923.     INC    BX
  1924.     MOV    [SI+BX],AX
  1925. DMA_PORTION:
  1926.     CLI
  1927.     MOV    BX,SI            ;SETUP PC DMA CONTROLLER
  1928.     MOV    DX,DS
  1929.     MOV    AX,DX            ;ADRESSE IN PAGE UND OFFSET UMRECHNEN
  1930.     SHL    DX,4
  1931.     SHR    AH,4            ;PAGE
  1932.     ADD    BX,DX            ;OFFSET NEU
  1933.     ADC    AH,0
  1934.     MOV    AL,AH
  1935.     MOV    SI,CS:DMA_CHANNEL
  1936.     CMP    SI,4
  1937.     JB    SHORT GDMI1
  1938.     SHRD    BX,AX,1            ;ADRESSE FÜR 16-BIT DMA
  1939.     JMP    SHORT GDMI2
  1940. GDMI1:    SHL    CX,1            ;ZAEHLER FÜR 8-BIT DMA
  1941.     INC    CX            ;SAMPLE ABSCHLUSS MIT EINEM WORD MEHR
  1942. GDMI2:    MOVZX    DX,CS:[DMA_MASK+SI]
  1943.     MOV    AL,BYTE PTR CS:DMA_CHANNEL
  1944.     OR    AL,4
  1945.     OUT    DX,AL            ;DMA-KANAL MASKIEREN
  1946.     MOVZX    DX,CS:[DMA_MOD+SI]
  1947.     AND    AL,3
  1948.     OR    AL,01001000B
  1949.     OUT    DX,AL            ;DMA-MODUS FÜR GUS
  1950.     MOVZX    DX,CS:[DMA_FLIP+SI]
  1951.     OUT    DX,AL            ;FLIP-FLOP CLEAR
  1952.     MOVZX    DX,CS:[DMA_ADR+SI]
  1953.     MOV    AL,BL            ;DMA CHANNEL 1-4
  1954.     OUT    DX,AL            ;OFFSET LOW
  1955.     MOV    AL,BH
  1956.     OUT    DX,AL            ;OFFSET HIGH
  1957.     MOVZX    DX,CS:[DMA_CNT+SI]
  1958.     MOV    AL,CL
  1959.     OUT    DX,AL            ;SIZE LOW
  1960.     MOV    AL,CH
  1961.     OUT    DX,AL            ;SIZE HIGH
  1962.     MOVZX    DX,CS:[DMA_PAGE+SI]
  1963.     MOV    AL,AH
  1964.     OUT    DX,AL            ;PAGE
  1965.     MOVZX    DX,CS:[DMA_MASK+SI]
  1966.     MOV    AX,SI
  1967.     AND    AL,3
  1968.     OUT    DX,AL            ;DMA-KANAL DEMASKIEREN
  1969.  
  1970.     MOV    DX,CS:BASE_PORT        ;SETUP GUS FOR DMA TRANSFER
  1971.     ADD    DX,CommandPort
  1972.     MOV    AL,DMAAddr        ;SET DMA ADDRESS
  1973.     OUT    DX,AL
  1974.     MOV    EAX,EDI
  1975.     SHR    EAX,4
  1976.     CMP    SI,4
  1977.     JB    SHORT GDMI3
  1978.     MOV    BX,AX            ;CONVERT FOR 16-BIT TRANSFER
  1979.     AND    AX,03FFFH
  1980.     SHR    AX,1
  1981.     AND    BX,0C000H
  1982.     OR    AX,BX
  1983. GDMI3:    INC    DX    
  1984.     OUT    DX,AX
  1985.     DEC    DX
  1986.     MOV    AL,DMACtrl
  1987.     OUT    DX,AL
  1988.     INC    DX
  1989.     INC    DX
  1990.     MOV    AX,SI
  1991.     AND    AL,4            ;SELECT 8/16-BIT CHANNEL
  1992.     OR    AX,BP            ;SELECT AMIGA/PC
  1993.     OR    AL,00100001B        ;START DMA TRANSFER
  1994.     OUT    DX,AL
  1995.     STI
  1996.     MOVZX    DX,CS:[DMA_STAT+SI]
  1997.     MOV    AH,CS:[DMA_BITS+SI]
  1998.     MOV    EBX,800000H        ;TIMEOUT
  1999. GDMI4:    DEC    EBX
  2000.     JZ    SHORT GDMI5
  2001.     OR    BL,BL
  2002.     JNZ    GDMI4
  2003.     IN    AL,DX            ;WAIT FOR TRANSFER END
  2004.     TEST    AL,AH
  2005.     JZ    GDMI4
  2006. GDMI5:    MOV    DX,CS:BASE_PORT        ;STOP GUS DMA
  2007.     ADD    DX,CommandPort
  2008.     MOV    AL,DMACtrl
  2009.     OUT    DX,AL
  2010.     INC    DX
  2011.     INC    DX
  2012.     IN    AL,DX            ;CLEAR IRQ, BUT MASTER IRQ IS DISABLED
  2013.     MOV    DX,CS:BASE_PORT        ;THERE HAPPENED NO IRQ
  2014.     ADD    DX,StatusPort
  2015.     IN    AL,DX
  2016. ;    MOVZX    DX,CS:[DMA_RESET+SI]    ;CASCADED DMA2 (MASTER) RESET
  2017. ;    OUT    DX,AL            ;RESET AUF MASTER DMA LOESCHT CASCADE
  2018.     CMP    SI,4
  2019.     JAE    SHORT NO_RESET2
  2020.     MOVZX    DX,CS:[DMA_RESET]    ;DMA1 (SLAVE) MASTER CLEAR
  2021.     OUT    DX,AL
  2022. NO_RESET2:
  2023.     AND    ECX,0FFFFH        ;INCREASE GUSMEM-POINTER
  2024.     INC    CX
  2025.     CMP    SI,4
  2026.     JB    SHORT GDMI6
  2027.     SHL    CX,1
  2028. GDMI6:    ADD    EDI,ECX
  2029.     MOV    CS:GUS_MEM,EDI
  2030.     RET
  2031. DMA_INIT ENDP
  2032. ;=============================================================================
  2033.  
  2034.  
  2035. ;=============================================================================
  2036. PLAY_MUSIC PROC NEAR
  2037.     PUSH    CS
  2038.     POP    DS
  2039.     CLI
  2040.     MOV    SI,54*2
  2041.     MOV    EBP,54
  2042.     MOV    CX,908-54+1
  2043. CountLoop:
  2044.     XOR    EDX,EDX
  2045.     MOV    EAX,369DE4H
  2046.     DIV    EBP
  2047.     MOV    EDX,100
  2048.     MUL    EDX
  2049.     MOV    EBX,Voices25
  2050.     DIV    EBX
  2051.     SHR    BX,1
  2052.     ADC    BX,0
  2053.     CMP    DX,BX
  2054.     JB    SHORT NoHigherFreq
  2055.     INC    AX
  2056. NoHigherFreq:
  2057.     MOV    [FREQ_TABLE+SI],AX
  2058.     INC    BP
  2059.     ADD    SI,2
  2060.     LOOP    CountLoop
  2061.     MOV    SAM_CH,8
  2062.     MOV    MOD_STAT,0
  2063.     MOV    PATT_ROW,64
  2064.     MOVZX    AX,SONG_START
  2065.     MOV    PATT_CURRENT,AX
  2066.     MOV    PATT_SPEED,6
  2067.     MOV    PATT_COUNT,1
  2068.     MOV    DI,OFFSET SAMP_CHANS
  2069.     XOR    BX,BX
  2070.     MOV    CX,CH_NUMB
  2071. ClearVarLoop:
  2072.     MOV    [DI.FREQ_VAL],0
  2073.     MOV    [DI.VOL],0
  2074.     MOV    AL,[PAN_REGS+BX]
  2075.     SHL    AL,4
  2076.     OR    AL,[PAN_REGS+BX]
  2077.     MOV    [DI.BALANCE],AL
  2078.     INC    BX
  2079.     ADD    DI,CHAN_SIZE
  2080.     LOOP    ClearVarLoop
  2081.  
  2082.     XOR    BX,BX            ;Set Pan Regs!!
  2083.     MOV    CX,NumVoices
  2084. LLDM14:    MOV    DX,BASE_PORT
  2085.     ADD    DX,ActiveVoicePort
  2086.     MOV    AL,NumVoices
  2087.     SUB    AL,CL
  2088.     OUT    DX,AL
  2089.     MOV    DX,BASE_PORT
  2090.     ADD    DX,CommandPort
  2091.     MOV    AL,VoiceBalance
  2092.     OUT    DX,AL
  2093.     MOV    DX,BASE_PORT
  2094.     ADD    DX,DataHighPort
  2095.     MOV    AL,[PAN_REGS+BX]
  2096.     OUT    DX,AL
  2097.     INC    BX
  2098.     LOOP    LLDM14
  2099.  
  2100.     MOV    AL,125
  2101.     CALL    GO_SETBPM
  2102.     MOV    BPM_COUNT,0
  2103.     MOV    COUNTER,20
  2104.     MOV    DX,BASE_PORT        ;Speaker On!!!
  2105.     MOV    AL,00000001B
  2106.     OUT    DX,AL
  2107.     STI
  2108.     CALL    IRQ_INIT
  2109.     RET
  2110. PLAY_MUSIC ENDP
  2111. ;-----------------------------------------------------------------------------
  2112. STOP_MUSIC PROC NEAR
  2113.     PUSH    CS
  2114.     POP    DS
  2115.     CALL    IRQ_INIT
  2116. US_OFF:    PUSH    CS
  2117.     POP    DS
  2118.     MOV    DX,BASE_PORT        ;Speaker Off!!!
  2119.     MOV    AL,00000011B
  2120.     OUT    DX,AL
  2121.     MOV    DX,BASE_PORT
  2122.     ADD    DX,ActiveVoicePort
  2123.     MOV    CX,NumVoices
  2124. VoiceClearL:
  2125.     MOV    AL,CL
  2126.     DEC    AL
  2127.     OUT    DX,AL
  2128.     INC    DX
  2129.     MOV    AL,WriteVoiceMode
  2130.     OUT    DX,AL
  2131.     ADD    DX,2
  2132.     MOV    AL,3            ;Voice Off
  2133.     OUT    DX,AL
  2134.     SUB    DX,2
  2135.     MOV    AL,VolumeCtrl
  2136.     OUT    DX,AL
  2137.     ADD    DX,2
  2138.     MOV    AL,3            ;Ramp Off
  2139.     OUT    DX,AL
  2140.     SUB    DX,3
  2141.     LOOP    VoiceClearL
  2142.     RET
  2143. STOP_MUSIC ENDP
  2144. ;-----------------------------------------------------------------------------
  2145. ; SERVICE IRQ UMLEITUNG; USES THE REAL-TIME-CLOCK IRQ
  2146. ;-----------------------------------------------------------------------------
  2147. IRQ_INIT PROC NEAR
  2148.     CLI
  2149.     XOR     AX,AX
  2150.     MOV     ES,AX
  2151.     CMP    SYSTEM,0
  2152.     JNE    SHORT WU11
  2153.     CMP    VAR_BUFSEG,0
  2154.     JNE    SHORT WU13
  2155.     MOV     AX,COMP_SPEED2        ;XCHANGE INIT & STOP DATA FOR DOS
  2156.     MOV     DX,COMP_SPEED3
  2157.     MOV     COMP_SPEED2,DX
  2158.     MOV     COMP_SPEED3,AX
  2159.     MOV    AL,UHR_STATA        ;UHR-IRQ-RATE EINSTELLEN (1024 HZ)
  2160.     OUT    UHR_INDEX,AL
  2161.     JMP    SHORT WU1
  2162. WU1:    JMP    SHORT WU2
  2163. WU2:    XCHG    AL,AH
  2164.     IN    AL,UHR_PORT
  2165.     AND    AL,0F0H
  2166.     OR    AL,DL
  2167.     XCHG    AL,AH
  2168.     OUT    UHR_INDEX,AL
  2169.     JMP    SHORT WU3
  2170. WU3:    JMP    SHORT WU4
  2171. WU4:    XCHG    AL,AH
  2172.     OUT    UHR_PORT,AL
  2173.     JMP    SHORT WU5
  2174. WU5:    JMP    SHORT WU6
  2175. WU6:    MOV    AL,UHR_STATB        ;UHR-IRQ-MODUS EINSTELLEN
  2176.     OUT    UHR_INDEX,AL
  2177.     JMP    SHORT WU7
  2178. WU7:    JMP    SHORT WU8
  2179. WU8:    XCHG    AL,AH
  2180.     IN    AL,UHR_PORT
  2181.     AND    AL,08FH
  2182.     MOV    DL,DH
  2183.     AND    DL,40H
  2184.     OR    AL,DL
  2185.     XCHG    AL,AH
  2186.     OUT    UHR_INDEX,AL
  2187.     JMP    SHORT WU9
  2188. WU9:    JMP    SHORT WU10
  2189. WU10:    XCHG    AL,AH
  2190.     OUT    UHR_PORT,AL
  2191.     IN    AL,IRQ4            ;IRQ8 DE-/MASKIEREN
  2192.     AND    AL,0FEH
  2193.     MOV    DL,DH
  2194.     AND    DL,1
  2195.     OR    AL,DL
  2196.     OUT    IRQ4,AL
  2197. WU13:    MOV     BX,4*70H                ;UHR-IRQ VERBIEGEN
  2198.     MOV     EAX,ES:[BX]
  2199.     MOV     EDX,HOLD70
  2200.     MOV     ES:[BX],EDX
  2201.     MOV     HOLD70,EAX
  2202.     JMP    SHORT WU12
  2203. WU11:    CMP    VAR_BUFSEG,0
  2204.     JNE    SHORT WU14
  2205.     MOV     AX,COMP_SPEED4        ;FOR WINDOWS
  2206.     MOV     DX,COMP_SPEED5
  2207.     MOV     COMP_SPEED4,DX
  2208.     MOV     COMP_SPEED5,AX
  2209.     MOV     AL,00110110B            ;TIMER0 AUF 1.024 KHZ EINSTELLEN
  2210.     OUT     PIT1,AL                 ;TEILER=1193
  2211.     MOV     AL,DL
  2212.     OUT     TIMER0,AL
  2213.     JMP     SHORT OUT40
  2214. OUT40:  MOV     AL,DH
  2215.     OUT     TIMER0,AL
  2216. WU14:    MOV     BX,4*8H                 ;TIMEOUT-IRQ VERBIEGEN
  2217.     MOV     EAX,ES:[BX]
  2218.     MOV     EDX,HOLD70
  2219.     MOV     ES:[BX],EDX
  2220.     MOV     HOLD70,EAX
  2221. WU12:    MOV    AL,20H
  2222.     OUT    IRQ3,AL
  2223.     OUT    IRQ1,AL
  2224.     STI
  2225.     RET
  2226. IRQ_INIT ENDP
  2227. ;-----------------------------------------------------------------------------
  2228. GET_SONGMOD PROC NEAR
  2229.     MOV    AL,CS:US_MODUS
  2230.     RET
  2231. GET_SONGMOD ENDP
  2232. ;-----------------------------------------------------------------------------
  2233. SET_SONGMOD PROC NEAR
  2234.     AND    AL,3
  2235.     MOV    CS:US_MODUS,AL
  2236.     PUSH    AX
  2237.     XOR    AH,AH
  2238.     TEST    AL,2
  2239.     JNZ    SHORT GSNG2
  2240.     MOV    AH,BYTE PTR CS:MUSIC_VOL
  2241. GSNG2:    CALL    SET_CDMIXER
  2242.     POP    AX
  2243. GSNG1:    RET
  2244. SET_SONGMOD ENDP
  2245.  
  2246. GET_SONGPOSITION PROC NEAR
  2247.     MOV    ah,BYTE PTR CS:PATT_CURRENT
  2248.     dec    ah
  2249.     MOV    al,byte ptr cs:[PATT_ROW]
  2250.     ret
  2251. GET_SONGPOSITION ENDP
  2252.  
  2253. SET_SONGPOSITION PROC NEAR
  2254.     PUSH    CX DI
  2255.     AND    AL,7FH
  2256.     MOV    BYTE PTR CS:PATT_CURRENT,AL
  2257.     MOV    CS:PATT_ROW,64
  2258.     MOV    DI,OFFSET SAMP_CHANS
  2259.     MOV    CX,CS:CH_NUMB
  2260. LSET1:    MOV    CS:[DI.VOL],0
  2261.     MOV    CS:[DI.INST_SET],0
  2262.     ADD    DI,CHAN_SIZE
  2263.     LOOP    LSET1
  2264.     POP    DI CX
  2265.     RET
  2266. SET_SONGPOSITION ENDP
  2267. ;-----------------------------------------------------------------------------
  2268. SET_SONGLOOP PROC NEAR
  2269.     MOV    CS:SONG_LOOP,AL
  2270.     RET
  2271. SET_SONGLOOP ENDP
  2272. ;-----------------------------------------------------------------------------
  2273. GET_VOLUME PROC NEAR
  2274.     MOV    AL,BYTE PTR CS:MASTER_VOLUME    ;0= MIN VOLUME,255= MAX VOLUME
  2275.     MOV    BL,BYTE PTR CS:MUSIC_VOLUME    ;0= MIN VOLUME,255= MAX VOLUME
  2276.     MOV    BH,BYTE PTR CS:FX_VOLUME    ;0= MIN VOLUME,255= MAX VOLUME
  2277.     RET
  2278. GET_VOLUME ENDP
  2279. ;-----------------------------------------------------------------------------
  2280. SET_VOLUME PROC NEAR
  2281.     MOV    BYTE PTR CS:MASTER_VOLUME,AL    ;0= MIN VOLUME,255= MAX VOLUME
  2282.     MOV    BYTE PTR CS:MUSIC_VOLUME,BL    ;0= MIN VOLUME,255= MAX VOLUME
  2283.     MOV    BYTE PTR CS:FX_VOLUME,BH    ;0= MIN VOLUME,255= MAX VOLUME
  2284.     PUSH    AX DX
  2285.     MOVZX    DX,AL
  2286.     INC    DX
  2287.     PUSH    DX
  2288.     MOVZX    AX,BL
  2289.     MUL    DX
  2290.     MOV    BYTE PTR CS:MUSIC_VOL,AH
  2291.     CALL    SET_CDMIXER
  2292.     POP    DX
  2293.     MOVZX    AX,BH
  2294.     MUL    DX
  2295.     MOV    BYTE PTR CS:FX_VOL,AH
  2296.     POP    DX AX
  2297.     RET
  2298. SET_VOLUME ENDP
  2299. ;-----------------------------------------------------------------------------
  2300. SET_CDMIXER PROC NEAR
  2301.     CMP    CS:CD_MIXER,0
  2302.     JE    GCD1
  2303.     PUSH    AX DX
  2304.     MOV    DX,CS:BASE_PORT        ;DETECT GUS VERSION
  2305.     ADD    DX,GUS_VERSION        ;GLEICH WIE ICMIX_SEL
  2306.     IN    AL,DX
  2307.     CMP    CS:ULTRA16,0        ;IST ULTRA16 ANGEGEBEN?
  2308.     JNE    SHORT GCD3
  2309.     CMP    AL,5            ;GUS BEFORE 3.7 NO MIXER
  2310.     JL    SHORT GCD2
  2311.     CMP    AL,10
  2312.     JAE    SHORT GCD3
  2313.     SHR    AH,1            ;ICS MIXER ON GUS 0-127
  2314.     MOV    AL,18            ;CD LINE LEFT CHANNEL
  2315.     OUT    DX,AL
  2316.     ADD    DX,ICMIX_DATA-ICMIX_SEL
  2317.     MOV    AL,AH
  2318.     OUT    DX,AL
  2319.     ADD    DX,ICMIX_SEL-ICMIX_DATA
  2320.     MOV    AL,19            ;CD LINE RIGHT CHANNEL
  2321.     OUT    DX,AL
  2322.     ADD    DX,ICMIX_DATA-ICMIX_SEL
  2323.     MOV    AL,AH
  2324.     OUT    DX,AL
  2325.     ADD    DX,ICMIX_SEL-ICMIX_DATA
  2326.     MOV    AL,10            ;LINE IN LEFT CHANNEL
  2327.     OUT    DX,AL
  2328.     ADD    DX,ICMIX_DATA-ICMIX_SEL
  2329.     MOV    AL,AH
  2330.     OUT    DX,AL
  2331.     ADD    DX,ICMIX_SEL-ICMIX_DATA
  2332.     MOV    AL,11            ;LINE IN RIGHT CHANNEL
  2333.     OUT    DX,AL
  2334.     ADD    DX,ICMIX_DATA-ICMIX_SEL
  2335.     MOV    AL,AH
  2336.     OUT    DX,AL
  2337.     JMP    SHORT GCD2
  2338. GCD3:    MOV    DX,CS:CODEC_PORT    ;CODEC MIXER ON GUS MAX 31-0
  2339.     SHR    AH,3
  2340.     JZ    SHORT GCD4
  2341.     XOR    AH,80H
  2342. GCD4:    XOR    AH,9FH
  2343.     MOV    AL,4            ;CD LEFT CHANNEL
  2344.     OUT    DX,AL
  2345.     INC    DX
  2346.     MOV    AL,AH
  2347.     OUT    DX,AL
  2348.     DEC    DX
  2349.     MOV    AL,5            ;CD RIGHT CHANNEL
  2350.     OUT    DX,AL
  2351.     INC    DX
  2352.     MOV    AL,AH
  2353.     OUT    DX,AL
  2354.     DEC    DX
  2355.     MOV    AL,12H            ;LINE IN LEFT CHANNEL
  2356.     OUT    DX,AL
  2357.     INC    DX
  2358.     MOV    AL,AH
  2359.     OUT    DX,AL
  2360.     DEC    DX
  2361.     MOV    AL,13H            ;LINE IN RIGHT CHANNEL
  2362.     OUT    DX,AL
  2363.     INC    DX
  2364.     MOV    AL,AH
  2365.     OUT    DX,AL
  2366. GCD2:    POP    DX AX
  2367. GCD1:    RET
  2368. SET_CDMIXER ENDP
  2369. ;-----------------------------------------------------------------------------
  2370. SET_LOADMOD_FLAG PROC NEAR
  2371.     AND    AL,1
  2372.     MOV    CS:LOADMOD_FLAG,AL    ;0= NORMAL, 1= CD PLAYER MODUS
  2373.     RET
  2374. SET_LOADMOD_FLAG ENDP
  2375. ;-----------------------------------------------------------------------------
  2376. SET_IRQ_RATE PROC NEAR
  2377.     PUSH    CS
  2378.     POP    DS
  2379.     MOV    BPM_RATE,AX
  2380.     MOV    AX,BPM_VALUE
  2381.     CALL    Go_SetBPM
  2382.     MOV    CL,8
  2383.     XOR    SI,SI
  2384. SIR1:    CMP    BPM_RATE,512
  2385.     JB    SHORT SIR2
  2386.     SHL    [SAM_COUNT+SI],4
  2387.     OR    [SAM_COUNT+SI],8
  2388.     JMP    SHORT SIR3
  2389. SIR2:    CMP    [SAM_COUNT+SI],16
  2390.     JB    SHORT SIR3
  2391.     SHR    [SAM_COUNT+SI],4
  2392. SIR3:    INC    SI
  2393.     INC    SI
  2394.     INC    CL
  2395.     CMP    CL,NumVoices-1
  2396.     JB    SIR1
  2397.     RET
  2398. SET_IRQ_RATE ENDP
  2399.  
  2400. ;=============================================================================
  2401. ; LOAD CONFIG DATA (PARSER)
  2402. ; IN: CX=0C242H, DS:BX= POINTER TO PARAM-BLOCK
  2403. ;
  2404. ; PARAM-BLOCK:     + 0 BASE PORT        210H-280H, 388H, ETC.
  2405. ;                  + 2 DMA NUMBER        0-7
  2406. ;                  + 3 IRQ NUMBER        0-15
  2407. ;        + 4 SAMPLE RATE        10000-44100
  2408. ;               + 6 INTERNAL TYPE       0,1,2,3,... (if necessary)
  2409. ;        + 7 INTERRUPT TYPE      0,1 (realtime clock, timer)
  2410. ;               + 8 STARTING POSITION   0-127
  2411. ;               + 9 LOOP POSITION    0-127,128
  2412. ;               +10 SONG MODUS        0-3
  2413. ;               +11 START MASTER VOLUME 0-255
  2414. ;        +12 START MUSIC VOLUME    0-255
  2415. ;               +13 START FX VOLUME     0-255
  2416. ;-----------------------------------------------------------------------------
  2417. CONFIG_INIT PROC NEAR
  2418.     MOV    DX,DS
  2419.     MOV    AX,CS
  2420.     MOV    DS,AX
  2421.     MOV    WORD PTR HOLD70+2,AX
  2422.     CMP    CX,0C242H
  2423.     JNE    SHORT NORMAL_CONFIG
  2424.     MOV    ES,DX
  2425.     MOV    AX,ES:[BX]
  2426.     MOV    BASE_PORT,AX
  2427.     ADD    AX,CODEC_BASE
  2428.     MOV    CODEC_PORT,AX
  2429.     MOV    AL,ES:[BX+2]
  2430.     AND    AX,7
  2431.     MOV    DMA_CHANNEL,AX
  2432.     MOV    AL,ES:[BX+7]
  2433.     AND     AL,1
  2434.     MOV     SYSTEM,AL
  2435.     MOV    AL,ES:[BX+8]
  2436.     AND    AL,127
  2437.     MOV    SONG_START,AL
  2438.     MOV    AL,ES:[BX+9]
  2439.     MOV    SONG_LOOP,AL
  2440.     MOV    AL,ES:[BX+10]
  2441.     AND     AL,3
  2442.     MOV    US_MODUS,AL
  2443.     MOV    AL,ES:[BX+11]
  2444.     MOV    BX,ES:[BX+12]
  2445.     CALL    SET_VOLUME
  2446.     JMP    CONT_CONFIG
  2447. NORMAL_CONFIG:
  2448. CONT_CONFIG:
  2449.     RET
  2450. CONFIG_INIT ENDP
  2451. ;-----------------------------------------------------------------------------
  2452. comment    #
  2453. SEEK_LINE PROC NEAR
  2454.     CLD
  2455.     MOV     SI,OFFSET QUEUE_BUFFER
  2456. LSKL1:  PUSH    BX
  2457. LSKL2:  CMP     BYTE PTR [BX],0
  2458.     JE      SHORT GSKL1
  2459.     CMP     SI,DX
  2460.     JAE     SHORT GSKL2
  2461.     LODSB
  2462.     CMP     AL,[BX]
  2463.     JNE     SHORT GSKL3
  2464.     INC     BX      
  2465.     JMP     LSKL2
  2466. GSKL3:  POP     BX
  2467.     JMP     LSKL1
  2468. GSKL2:  POP     BX
  2469.     CLC
  2470.     RET
  2471. GSKL1:  POP     BX
  2472.     STC
  2473.     RET
  2474. SEEK_LINE ENDP
  2475. #
  2476. ;=============================================================================
  2477.  
  2478.  
  2479. ;=============================================================================
  2480. ;
  2481. ; MOD LADEROUTINEN
  2482. ;
  2483. ;=============================================================================
  2484. ; LÄDT EIN MODFILE
  2485. ; DS:DX= FILENAME
  2486. ;-----------------------------------------------------------------------------
  2487. SegMod    dw    0
  2488. OffMod    dd    0
  2489. LOAD_MOD PROC NEAR
  2490. ifdef zpliku;comment    #
  2491.     MOV    AX,3D00H        ;OPEN MOD
  2492.     INT    21H
  2493.     JC    GLDM1
  2494.     PUSH    CS
  2495.     POP    DS
  2496.     MOV    GDDHANDLE,AX
  2497. else;#
  2498.     mov    cs:[segMod],ds
  2499.     mov    cs:[offmod],edx
  2500. endif
  2501.     push    cs
  2502.     pop    ds
  2503. GLDM0:    CALL    SET_TMEM        ;ALLOCATE TRACK-BUFFER
  2504. ifdef zpliku
  2505.     MOV    BX,GDDHANDLE
  2506. endif
  2507.     MOV    GDDZEIG,0
  2508.     CMP    LOADMOD_FLAG,0
  2509.     JNE    GLDM99
  2510.     MOV    CX,10            ;SONG-NAME HOLEN
  2511. LLDM1:    CALL    GET_QUEUE
  2512.     JC    GLDM2
  2513.     LOOP    LLDM1
  2514.     XOR    SI,SI            ;31 INSTRUMENTS
  2515. LLDM2:    MOV    CX,11            ;INSTRUMENT NAME
  2516. LLDM3:    CALL    GET_QUEUE    
  2517.     JC    GLDM2
  2518.     LOOP    LLDM3
  2519.     XOR    EAX,EAX
  2520.     CALL    GET_QUEUE        ;INSTRUMENT SIZE
  2521.     XCHG    AL,AH
  2522.     CMP    AX,2
  2523.     JAE    SHORT GLDM20
  2524.     XOR    AX,AX
  2525. GLDM20:    SHL    AX,1
  2526.     MOV    [ISIZE+SI],AX        ;HÖCHSTENS 64K
  2527.     CALL    GET_QUEUE        ;IVOLUME & FINETUNE
  2528.     PUSH    AX
  2529.     XOR    AH,AH
  2530.     MOV    [IFINETUNE+SI],AX
  2531.     POP    AX
  2532.     SHR    AX,8
  2533.     CMP    AX,40H
  2534.     JBE    SHORT GLDM9
  2535.     MOV    AX,40H
  2536. GLDM9:    MOV    [IVOLUME+SI],AX
  2537.     CALL    GET_QUEUE        ;ILOOP_START
  2538.     XCHG    AL,AH
  2539.     SHL    AX,1
  2540.     MOV    [ILOOP_START+SI],AX
  2541.     CALL    GET_QUEUE        ;ILOOP_SIZE
  2542.     XCHG    AL,AH
  2543.     SHL    AX,1
  2544.     MOV    [ILOOP_SIZE+SI],AX
  2545.     INC    SI
  2546.     INC    SI
  2547.     CMP    SI,62
  2548.     JB    LLDM2
  2549.     CALL    GET_QUEUE        ;SONG_SIZE & LOOP_BYTE OR NOTHING
  2550.     JC    GLDM2
  2551.     MOV    SONG_SIZE,AL
  2552.     MOV    SONG_LOOP,AH
  2553.     XOR    DX,DX
  2554.     MOV    CX,64            ;SONG_DATA
  2555.     MOV    DI,OFFSET SONG_DATA
  2556. LLDM4:    CALL    GET_QUEUE
  2557.     JC    GLDM2
  2558.     MOV    [DI],AX
  2559.     CMP    AL,DL            ;FIND HIGHEST PATTERN NUMBER
  2560.     JBE    SHORT GLDM12
  2561.     MOV    DL,AL
  2562. GLDM12:    CMP    AH,DL
  2563.     JBE    SHORT GLDM13
  2564.     MOV    DL,AH
  2565. GLDM13:    INC    DI
  2566.     INC    DI
  2567.     LOOP    LLDM4
  2568.     INC    DL
  2569.     CLD
  2570.     MOV    PATTERN_NUMBER,DX
  2571.     CALL    GET_QUEUE
  2572.     PUSH    AX
  2573.     CALL    GET_QUEUE
  2574.     SHL    EAX,16
  2575.     POP    AX
  2576.     CMP    EAX,"NHC8"        ;8CHN-MOD
  2577.     JE    SHORT GLDM3
  2578.     CMP    EAX,"8TLF"        ;FLT8-MOD
  2579.     JE    SHORT GLDM3
  2580.     CMP    EAX,"ATCO"        ;OCTA-MOD
  2581.     JE    SHORT GLDM3
  2582.     CMP    EAX,"NHC6"        ;6CHN-MOD
  2583.     JE    SHORT GLDM16
  2584.     CMP    EAX,".K.M"        ;M.K.-MOD
  2585.     JE    SHORT GLDM10
  2586.     CMP    EAX,"4TLF"        ;FLT4-MOD
  2587.     JNE    GLDM2
  2588.  
  2589. GLDM10:    MOV    CH_NUMB,4        ;4-CHANNEL-MOD
  2590.     MOV    PATTERN_SIZE,1024
  2591.     MOV    AH,0
  2592.     MOV    TRACK_INFO+4,AH
  2593.     MOV    TRACK_INFO+5,AH
  2594.     MOV    TRACK_INFO+6,AH
  2595.     MOV    TRACK_INFO+7,AH
  2596.     JMP    SHORT GLDM11
  2597. GLDM16:    MOV    CH_NUMB,6        ;6-CHANNEL-MOD
  2598.     MOV    PATTERN_SIZE,1536
  2599.     MOV    AH,0
  2600.     MOV    TRACK_INFO+6,AH
  2601.     MOV    TRACK_INFO+7,AH
  2602.     JMP    SHORT GLDM11
  2603. GLDM3:    MOV    CH_NUMB,8        ;8-CHANNEL-MOD: GET-PATTERNS
  2604.     MOV    PATTERN_SIZE,2048
  2605. GLDM11:    MOV    PATT_CURRENT,0
  2606.     MOV    TRACK_NUMBER,0
  2607. LLDM7:    MOV    ES,PATTERN_SEG
  2608.     MOV    BX,GDDHANDLE
  2609.     XOR    DI,DI
  2610. LLDM6:    XOR    SI,SI
  2611. LLDM5:    CALL    GET_QUEUE        ;PATTERN HOLEN UND IN TRACKS AUFSPALTEN
  2612.     JC    GLDM2
  2613.     MOV    DX,AX
  2614.     CALL    GET_QUEUE
  2615.     JC    GLDM2
  2616.     PUSH    DI
  2617.     ADD    DI,SI
  2618.     SHL    EAX,16
  2619.     MOV    AX,DX
  2620.     STOSD
  2621.     POP    DI
  2622.     ADD    SI,256
  2623.     CMP    SI,PATTERN_SIZE        ;NEXT TRACK/CHANNEL
  2624.     JB    LLDM5
  2625.     ADD    DI,4            ;NEXT NOTE
  2626.     CMP    DI,256
  2627.     JB    LLDM6
  2628.     MOV    ES,TRACK_SEG        ;TRACK1-8 INTEGRIEREN
  2629.     MOV    DX,TRACK_NUMBER
  2630.     XCHG    DL,DH
  2631.     MOV    DS,PATTERN_SEG
  2632.     XOR    SI,SI
  2633.     XOR    BX,BX
  2634. LLDM8:    XOR    DI,DI
  2635. LLDM9:    CMP    DX,DI
  2636.     JBE    SHORT GLDM4
  2637.     PUSH    SI DI
  2638.     MOV    CX,256/4
  2639.     REPE CMPSD            ;TRACK ALREADY EXISTS?
  2640.     POP    DI SI
  2641.     PUSHF
  2642.     ADD    DI,256
  2643.     POPF
  2644.     JNE    LLDM9
  2645.     JMP    SHORT GLDM5
  2646. GLDM4:    INC    DH            ;NO, ADD TRACK TO BUFFER
  2647.     PUSH    SI
  2648.     MOV    CX,256/4
  2649.     REP MOVSD
  2650.     POP    SI
  2651. GLDM5:    MOV    AX,DI            ;YES
  2652.     DEC    AH
  2653.     MOV    CS:[TRACK_INFO+BX],AH
  2654.     INC    BX
  2655.     ADD    SI,256
  2656.     CMP    BX,CS:CH_NUMB
  2657.     JB    LLDM8
  2658.     PUSH    CS
  2659.     POP    DS
  2660.     XCHG    DL,DH
  2661.     MOV    TRACK_NUMBER,DX
  2662.     XOR    BX,BX            ;TRACKLISTE NACHFÜHREN
  2663.     MOV    AX,PATT_CURRENT
  2664. LLDM10:    CMP    [SONG_DATA+BX],AL
  2665.     JNE    SHORT GLDM6
  2666.     MOV    AH,TRACK_INFO
  2667.     MOV    [TRACK1_DATA+BX],AH
  2668.     MOV    AH,TRACK_INFO+1
  2669.     MOV    [TRACK2_DATA+BX],AH
  2670.     MOV    AH,TRACK_INFO+2
  2671.     MOV    [TRACK3_DATA+BX],AH
  2672.     MOV    AH,TRACK_INFO+3
  2673.     MOV    [TRACK4_DATA+BX],AH
  2674.     MOV    AH,TRACK_INFO+4
  2675.     MOV    [TRACK5_DATA+BX],AH
  2676.     MOV    AH,TRACK_INFO+5
  2677.     MOV    [TRACK6_DATA+BX],AH
  2678.     MOV    AH,TRACK_INFO+6
  2679.     MOV    [TRACK7_DATA+BX],AH
  2680.     MOV    AH,TRACK_INFO+7
  2681.     MOV    [TRACK8_DATA+BX],AH
  2682. GLDM6:    INC    BX
  2683.     CMP    BL,128
  2684.     JB    LLDM10
  2685.     INC    PATT_CURRENT        ;NÄCHSTES PATTERN HOLEN
  2686.     MOV    AX,PATT_CURRENT
  2687.     CMP    AX,PATTERN_NUMBER
  2688.     JB    LLDM7
  2689.     JMP    SHORT GLDM7
  2690.  
  2691. GLDM99:    MOV    ES,TRACK_SEG        ;TRACK SEGMENT WIEDER LÖSCHEN
  2692.     MOV    AH,49H
  2693.     INT    21H
  2694.     MOV    GUS_MEM,0
  2695. GLDM7:    MOV    ES,PATTERN_SEG        ;PATTERN SEGMENT WIEDER LÖSCHEN
  2696.     MOV    AH,49H
  2697.     INT    21H
  2698.     MOV    PATTERN_SEG,0
  2699.     CALL    INIT_DEVICE        ;IS PROBABLY THE FIRST INIT
  2700.     CMP    LOADMOD_FLAG,0
  2701.     JNE    GLDM98
  2702.     MOV    BX,TRACK_NUMBER        ;TRACK SEGMENT REDUZIEREN
  2703.     SHL    BX,4
  2704.     MOV    ES,TRACK_SEG
  2705.     MOV    AH,4AH
  2706.     INT    21H
  2707.  
  2708.     MOVZX    AX,GDDZEIG        ;FILEZEIGER KORRIGIEREN
  2709.     OR    AX,AX            ;BUFFER ABHÄNGEN
  2710.     JZ    SHORT GLDM30
  2711.     MOV    DX,GDDREST
  2712.     SUB    DX,AX
  2713.     JZ    SHORT GLDM30
  2714.     XOR    CX,CX
  2715.     MOV    GDDZEIG,CL
  2716.     MOV    BX,GDDHANDLE
  2717.     NEG    DX
  2718.     DEC    CX
  2719. ifdef zpliku;comment    #
  2720.     MOV    AX,4201H        ;DATEIZEIGER ZURÜCKBEWEGEN
  2721.     INT    21H
  2722. else;#
  2723.     add    word ptr cs:[offMod],dx
  2724.     adc    word ptr cs:[offMod][2],cx
  2725. endif
  2726. GLDM30:    MOV    AH,48H            ;SAMPLE BUFFER BEREIT
  2727.     MOV    BX,2000H        ;128K WEGEN 64K DMA FENSTER
  2728.     INT    21H
  2729.     MOV    GDDSEG,AX
  2730.     TEST    AX,0FFFH
  2731.     JZ    SHORT GLDM31
  2732.     AND    AX,0F000H
  2733.     ADD    AX,1000H
  2734. GLDM31:    MOV    BUFSEG,AX
  2735.     XOR    EDI,EDI            ;SAMPLES LADEN
  2736.     MOV    GUS_MEM,EDI
  2737.     XOR    SI,SI
  2738. LLDM12:    PUSH    SI
  2739.     MOV    CX,[ISIZE+SI]
  2740.     JCXZ    SHORT GLDM8
  2741.     SHL    SI,1
  2742.     TEST    EDI,31
  2743.     JZ    SHORT GLDM32
  2744.     AND    EDI,-32            ;32 BYTE BOUND FOR DMA
  2745.     ADD    EDI,32
  2746. GLDM32:    MOV    [IOFFSET+SI],EDI
  2747.     MOV    BX,GDDHANDLE        ;SAMPLE IN BUFFER LADEN
  2748.     PUSH    DS
  2749.     XOR    DX,DX
  2750.     MOV    SI,DX
  2751.     MOV    DS,BUFSEG
  2752. ifdef zpliku;comment    #
  2753.     MOV     AH,3FH
  2754.     INT     21H
  2755. else;#
  2756.     pushf
  2757.     pushad
  2758.     push    es
  2759.     push    ds
  2760.     pop    es
  2761.     mov    ds,cs:[SegMod]
  2762.     movzx    edi,dx
  2763.     mov    esi,cs:[offmod]
  2764.     rep
  2765.     db    67h
  2766.     movsb
  2767.     mov    cs:[offmod],esi
  2768.     push    es
  2769.     pop    ds
  2770.     pop    es
  2771.     popad
  2772.     popf
  2773.  
  2774. endif
  2775.  
  2776.     SHR    CX,1
  2777.     XOR    BX,BX            ;AMIGA-SAMPLE
  2778.     CALL    SEND_SAMPLE_DATA
  2779.     POP    DS
  2780. GLDM8:    POP    SI
  2781.     INC    SI
  2782.     INC    SI
  2783.     CMP    SI,62
  2784.     JB    LLDM12
  2785.     MOV    ES,GDDSEG        ;SAMPLE BUFFER FREIGEBEN
  2786.     MOV    AH,49H
  2787.     INT    21H
  2788.     MOV    GDDSEG,0
  2789. GLDM98:    CLC
  2790.     JMP    SHORT GLDM15
  2791. GLDM2:    STC
  2792. GLDM15:    PUSHF
  2793.     CMP    VAR_BUFSEG,0
  2794.     JNE    SHORT GLDM97
  2795. ifdef zpliku;comment    #
  2796.     MOV    AH,3EH
  2797.     MOV    BX,GDDHANDLE
  2798.     INT    21H
  2799. endif;#
  2800. GLDM97:    POPF
  2801. GLDM1:    RET
  2802. LOAD_MOD ENDP
  2803. ;-----------------------------------------------------------------------------
  2804. ; HOLT EIN WORD AUS DEM BUFFER
  2805. ; IN: AX= WORD, BX= HANDLE
  2806. ;-----------------------------------------------------------------------------
  2807. GET_QUEUE PROC NEAR
  2808.     CMP     GDDZEIG,0
  2809.     JNE     SHORT GTQ1
  2810. ifdef zpliku;comment    #
  2811.     PUSH    CX DX
  2812.     MOV     DX,OFFSET QUEUE_BUFFER
  2813.     MOV     CX,256
  2814.     MOV     AH,3FH
  2815.     INT     21H
  2816.     MOV    GDDREST,AX
  2817.     POP    DX CX
  2818. else;#
  2819.     pushf
  2820.     cld
  2821.     pushad
  2822.     push    es
  2823.     MOV     edi,OFFSET QUEUE_BUFFER
  2824.     MOV     ecx,256
  2825.     push    ds
  2826.     pop    es
  2827.     mov    ds,cs:[SegMod]
  2828.     mov    esi,cs:[OffMod]
  2829.     rep
  2830.     db    67h
  2831.     movsb
  2832.     push    es
  2833.     pop    ds
  2834.     mov    cs:[offmod],esi
  2835.     MOV    GDDREST,256
  2836.     pop    es
  2837.     popad
  2838.     popf
  2839. endif
  2840. GTQ1:   PUSH    BX
  2841.     MOV     BL,GDDZEIG
  2842.     XOR     BH,BH
  2843.     CMP    BX,GDDREST
  2844.     JAE    SHORT GTQ2
  2845.     MOV     AX,[QUEUE_BUFFER+BX]
  2846.     ADD     GDDZEIG,2
  2847.     POP    BX
  2848.     CLC
  2849.     RET
  2850. GTQ2:    POP    BX
  2851.     STC
  2852.     RET
  2853. GET_QUEUE ENDP
  2854. ;----------------------------------------------------------------------------
  2855. ; RESERVIERT SPEICHER FÜR TRACKS, CARRY-FLAG 0=OK 1=ABBRUCH
  2856. ;----------------------------------------------------------------------------
  2857. SET_TMEM PROC NEAR
  2858.     MOV     AH,48H
  2859.     MOV     BX,1000H                ;64K TRACK BUFFER (WIRD RESIZED)
  2860.     INT     21H
  2861.     JC      SHORT STCM1
  2862.     MOV     TRACK_SEG,AX
  2863.     MOV    AH,48H
  2864.     MOV    BX,80H            ;2K PATTERN BUFFER
  2865.     INT    21H
  2866.     JC    SHORT STCM1
  2867.     MOV    PATTERN_SEG,AX
  2868. STCM1:  RET
  2869. SET_TMEM ENDP
  2870. ;----------------------------------------------------------------------------
  2871. END_MUSIC PROC NEAR
  2872.     CALL    INIT_DEVICE
  2873.     CMP    LOADMOD_FLAG,0
  2874.     JNE    SHORT LEM3
  2875.     MOV     AH,49H
  2876.     MOV     ES,TRACK_SEG
  2877.     INT     21H
  2878.     CMP    PATTERN_SEG,0
  2879.     JE    SHORT LEM3
  2880.     MOV     AH,49H
  2881.     MOV     ES,PATTERN_SEG
  2882.     INT     21H
  2883.     MOV    PATTERN_SEG,0
  2884. LEM3:    CMP    GDDSEG,0
  2885.     JE    SHORT LEM4
  2886.     MOV     AH,49H
  2887.     MOV     ES,GDDSEG
  2888.     INT     21H
  2889.     MOV    GDDSEG,0
  2890. LEM4:    XOR    EAX,EAX
  2891.     MOV    GDDLENGTH,EAX
  2892.     MOV    GDDREST,AX
  2893.     MOV    GDDHANDLE,AX
  2894.     MOV    GDDSEG,AX
  2895.     MOV    BUFSEG,AX
  2896.     MOV    GDDZEIG,AL        ;RESET VARIABLES
  2897.     MOV    SAM_CH,8
  2898.     MOV    MOD_STAT,AL
  2899.     XOR    BX,BX
  2900.     MOV    CX,11
  2901. LEM1:    MOV    WORD PTR [BPM_COUNT+BX],AX
  2902.     ADD    BX,2
  2903.     LOOP    LEM1
  2904.     MOV    CH_NUMB,4
  2905.     MOV    TRACK_NUMBER,AX
  2906.     MOV    DWORD PTR TRACK_INFO,EAX
  2907.     MOV    DWORD PTR TRACK_INFO+4,EAX
  2908.     MOV    TRACK_SEG,AX
  2909.     MOV    BX,OFFSET TRACK1_DATA
  2910. LEM2:    MOV    [BX],AL
  2911.     INC    BX
  2912.     CMP    BX,OFFSET PATTJUMPS
  2913.     JB    LEM2
  2914.     MOV    IRQCOUNT,56
  2915.     RET
  2916. END_MUSIC ENDP
  2917.  
  2918. IF COM_OR_OBJ
  2919. ;=============================================================================
  2920. MAIN_CONT PROC NEAR
  2921.     PUSH    BP DS CS ES
  2922.     POP    DS
  2923.     SHL    DI,2
  2924.     ADD    DI,0100H
  2925.     CALL    DI            ;FAR CALL
  2926.     SETC    DL
  2927.     XOR    DH,DH
  2928.     POP    DS BP            ;BP IS ABSOLUTELY IMPORTANT FOR C
  2929.     RETF
  2930. MAIN_CONT ENDP
  2931. ;=============================================================================
  2932. endif
  2933.  
  2934. CODE_SEG4 ENDS
  2935.  
  2936. END _MAIN4_G